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

  最近在做一个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框架为什么会产生这个问题, 还是没有找个一个比较好的解释。

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值