前两天出去面试的时候被问到一个问题:keyWindow获取到的window会不会发生改变?
讲真的以前用到的东西都是只要能用就行了,没有过多的取研究为什么不能用,为什么要这么用,这几天的面试让我也学好了很多东西,我们不能停留在会用的基础上了,言归正传,下班我们来看一下keyWindow什么情况下会发生改变:
首先我们先来看一下正常情况下获取到的keyWindow是哪一个window:
很明显正常情况下得到的是UIWindow类,这是我们需要的类,那么我们试一下在弹出层弹出之后,再去获取keyWindow得到的是哪一个:
这个时候得到的keyWindow变成了UIAlertControllerShimPresenterWindow,说明keyWindow的类发生了改变。那这个时候添加view和移除view时,view会怎么变化呢。
这两个对比很明显,弹出前和弹出后view添加的图层发生了改变,而当移除的时候UIAlertControllerShimPresenterWindow上添加的view也被移除了。说明移除弹出层之后这个keyWindow——UIAlertControllerShimPresenterWindow 也会被移除掉 ,或者说是keyWindow类变成了UIWindow。
总结一点:
1.经过测试keyWindow永远是覆盖在视图的最外层,在正常情况下获取到的keyWindow是UIWindow;
2.在有UIAlertView或UIActionSheet的弹出层情况下,在去获取keyWindow这个时keyWindow就会变成UIAlertControllerShimPresenterWindow这个类,是弹出层上层的一个window;
3.在UIAlertView或UIActionSheet弹出后再给keyWindow添加的view,会在UIAlertView弹出层消失后,keyWindow上边的视图也会随之消失;
所以如果要可以使用UIApplication.shared.windows.last(获取到的图层是UIWindow)去添加view,这样又弹出层的话还是添加到系统的弹出层下,不会随着弹出层的消失而消失。
以上只是个人见解,仅供参考。