xib文件再次加载导致的orientation问题

来源:互联网 发布:网络割接 编辑:程序博客网 时间:2024/06/05 15:21

  最近在做一个iPad的项目, 整个程序暂时只是支持landscape模式。 所以我们把项目设定里面的支持设备方向的地方设置好, 然后把所有viewController里面的shouldAutorotateToInterfaceOrientation 都返回NO. 整个程序工作正常,启动后默认切换到了landscape模式。

   可是不知道什么情况,测试突然有一天报了一个转向(orientation)错误的bug, 并且没有提供一个比较一致的重现步骤,只是提到在iPad 1 上有比较高的重现率。(不能重现, 或者没有具体重现步骤的Bug最让人纠结。) 对于这种bug, 首先想到的是把所有与转向相关的设置和代码全部检查一般,结果一无所获。 考虑到iPad1和iPad2的差异, 我们首先想到的可能是内存的影响。 于是把设备连上调试器开始不断跑各种用例希望能够得到重现后的一个log. 几轮测试下来, 终于重现了这个bug. 一看log,又是memory warning惹的祸。 原来iPad的内存相对较小, 当应用稍微使用多一点内存就容易产生memory warning. 之后系统框架会开始把xib释放掉并调用viewDidUnload。 当回来这个页面时,框架会重现加载xib和调用viewDidLoad。而这个出现问题的页面是一个根页面。 也就是UIWindow的setRootViewController设置的。每次回到这个页面时都会用setRootViewController设置它。也许是由于框架本身实现的原因,在设置setRootViewController时如果只是重新加载xib,系统竟然默认为potrait模式。 所以整个页面UI就被转了90度。 然后我们整个应用的自动转向都禁掉了,于是就产生了这个bug.

   一个比较简单的解决方案是在重新设置根viewController时把它的transform 和 UIWindow的同步一下。

        self.viewControllerNew.view.transform = self.window.rootViewController.view.transform;
        self.window.rootViewController = self.viewControllerNew;

至于cocoa框架为什么会产生这个问题, 还是没有找个一个比较好的解释。

  

原创粉丝点击