本文所有的結論都是在iOS9的情況下。
先來看看UIWindow 的一些子類,如下圖所示。
Snip20160105_9
1、目前UIWindow 的 windowLevel 的取值范圍是 (0.0-10000000.0)
2、如果新建一個window,想把它變為keyWindow,這個window是局部變量的時候,會沒有效果。
3、并不是執行了makeKeyAndVisible/makeKeyWindow/becomeKeyWindow 方法 ,window 就一定會變成keyWindow。比如,當系統AlertView 出現時,keyWindow是_UIAlertControllerShimPresenterWindow,這個時候keyWindow 就是不可覆蓋的。
4、_UIAlertControllerShimPresenterWindow 這個系統AlertView的載體window 不在[UIApplication sharedApplication].windows 數組中。
5、當判斷或設置 app的 rootViewController的時候,推薦使用[[UIApplication sharedApplication].delegate window].rootViewController 而不是[[UIApplication sharedApplication]keyWindow].rootViewController,后者偶爾會出現它并不是你想要的那個controller。
最后附上 _UIAlertControllerShimPresenterWindow的層次結構圖,供大家學習研究。
Snip20160105_10