项目中一直用了两个UIWindow,一个是框架默认的,另一个是用来显示调试信息的UIWindow。至于为什么要用一个UIWindow,而不是用UIView呢,是因为UIView旋转控制太麻烦了,如果用UIView加一个UIViewController会方便很多,而且也不用考虑系统版本的区别。
最近一个同事用同样的方法使用UIWindow子类做一个提示框的公用组件,但发现rootViewController
无法自动旋转。于是我对比了两个UIWindow的子类,发现代码并没什么区别,只是多了一些公用方法和一个delegate
。但就是不能支持旋转,而我的都正常,试过好多方法,都没找到原因。最后只好一部分一部分注释掉一些代码。当我把一个delegate
的属性注释掉以后,神奇的事情发生了,竟然可以旋转了!!!! 于是把所有改动都还原了,然后只注释掉delegate
属性(改一个名称也一样),发现旋转一切正常了。于是在我之前的UIWindow子类中添加delegate
属性,发现也不能进行旋转。
猜想是不是子类delegate
属性覆盖了父类的delegate
属性,而UIWindow在控制旋转的逻辑跟delegate
属性有关。至少有一下两种方式进行调试:
- 子类UIWindow中添加
delegate
属性,然后在setDelegate方法中添加日志。 - 使用Category为UIWindow添加一个
delegate
属性声明,然后打印delegate
属性
通过上述方法可以发现,UIWindow内部实现是存在一个delegate
属性的,根据日志可以确定该属性是指向rootViewController
对象。也就是说如果我们在UIWindow子类添加delegate
属性就会影响到UIWindow对旋转的控制。
后续调试发现旋转的相关方法在rootViewController
中都会正常被调用,但就是没办法进行旋转,也就是说在UIWindow子类中添加delegate
属性和没有添加该属性,对应我们应用来说,该走的方法都会按照正常流程跑完,但就是不能进行旋转。具体原因还未知,后续有新发现将会更新,如果有人知道,还请告知,谢谢,以下我的调试环境:
OSX版本为:10.10.5 (14F27)
Xcode 版本为:7.2 (7C68)
SDK:iOS 9.2