iOS8 – 防止呈现viewController旋转

我们有一个带有tableView的MainViewController,它提供了一个新的modalViewController。

MainViewController仅限于肖像,并且modalViewController可以旋转。

问题是在iOS8中,当modalViewController旋转时,在MainViewcontroller中iOS8中的旋转callback方法被称为- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

因此,UITableView正在重新获得它的数据,这是我们不想要的行为。

我们可以防止iOS 8的这个function,而不是旋转呈现UIViewController?

所以经过漫长的search和调查,我终于想出了一个可能的解决scheme。

首先,我可以使用导航控制器,并推动viewController而不是呈现它,但它打破了我的代码,只是不是如此。

我能做的第二件事情不是设置限制。 我仍然可以使用自动布局,但是如果我不设置约束,并且让默认约束被设置,tableView不会被重载。 当然这也是不是很聪明的事情,因为我在我的viewController中有很多元素。

最后,我发现我可以在另一个UIWindow中显示这个“模态”viewController。 我创buildUIWindow并将其设置为其rootViewController。

我把一些示例项目在git中: https : //github.com/OrenRosen/ModalInWindow

希望这会有帮助。

我做了一个类似的导航控制器,这将不会旋转,除非顶部推动控制器旋转。

在你的情况下,检查主控制器是否提供另一个控制器。 如果不是则拒绝旋转,否则返回呈现的控制器返回的旋转方法。

至于你的表格视图,它不应该因为旋转而重新加载

在iOS 8中,更改设备方向时旋转的视图是添加到UIWindow的第一个视图。 因此,如果您在shouldAutorotate保存对其的引用,则可以覆盖shouldAutorotatesupportedInterfaceOrientations值。