其实我们平常写的最多的也就是keyWindow的写法
UIWindow *window = [UIApplication sharedApplication].keyWindow
可是有的地方我们还是要写成这样子的
UIWindow *window = [UIApplication sharedApplication].delegate.window
那么,这两者的区别是什么呢?
接下来我们一起去探讨这问题,首先,让我们来看一段代码:
从打印结果中可以知道:
keyWindow与delegate中的window其实是一样的,keyWindow的存在的意义,其实就是为了说明当前的window接管了这个控制器的view而已,你可以在keyWindow上加载你自己的建立的view了。
之前想要拿到app的窗口,我们通常的写法是:
[UIApplication sharedApplication].keyWindow
这种写法之前一直也觉得是正确的,没什么问题,而且网上大多数的博客或者资料中也是这样写的,但是最近在项目,发现这样写是不安全的,如果应用程序没有跳转,这种写法还算是可行的,但是如果应用程序出现了跳转(分享跳转到其他APP,访问系统相册等),这时返回原APP,你会发现加载原窗口上的视图位置会发生明显偏移,查阅了一些资料,发现如果写成
[[[UIApplication sharedApplication]delegate]window]
就不会出现上述问题,如果大家在项目中遇到此问题,不妨试试这种写法。
UIWindowLevel详解
1)我们生成的normalWindow虽然是在第一个默认的window之后调用makeKeyAndVisible,但是仍然没有显示出来。这说明当Level层级相同的时候,只有第一个设置为KeyWindow的显示出来,后面同级的再设置KeyWindow也不会显示。
2)statusLevelWindow在alertLevelWindow之后调用makeKeyAndVisible,仍然只是显示在alertLevelWindow的下方。这说明UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面。