我们有一个带有tableView的MainViewController,它提供了一个新的modalViewController。
MainViewController仅限于纵向,modalViewController可以旋转。
问题出在iOS8中,当modalViewController旋转时,调用MainViewcontroller中iOS8中的旋转回调方法 - - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
因此,UITableView正在重新加载其数据,这是我们不想要的行为。
我们可以阻止iOS 8的这个功能,而不是旋转呈现的UIViewController吗?
经过漫长的搜索和调查,我终于想出了一个可能的解决方案。
首先,我可以使用导航控制器并推送viewController而不是呈现它,但它会破坏我的代码,但事实并非如此。
我能做的第二件事就是不设置约束。我仍然可以使用autolayout,但是如果我没有设置约束,并且设置了默认约束,则不会重新加载tableView。当然这也不是很聪明的事情,因为我在viewController中有很多元素。
最后,我发现我可以在另一个UIWindow中显示这个“模态”viewController。我创建UIWindow并将modalViewController设置为其rootViewController。
我在git中放了一些示例项目:
https://github.com/OrenRosen/ModalInWindow
希望它会有所帮助。
我做了点什么 类似 使用导航控制器,除非顶部推动控制器旋转,否则不会旋转。
在您的情况下检查主控制器是否正在显示另一个控制器。如果不是那么只是拒绝旋转,否则返回所呈现的控制器为旋转方法返回的任何内容。
至于你的表视图,它不应该得到 重装 因为轮换。
在iOS 8中,更改设备方向时旋转的视图是添加到的第一个视图 UIWindow
。所以,如果你在你的保存中保存一个引用 presentedController
,你可以覆盖 shouldAutorotate
和 supportedInterfaceOrientations
值。