iOS8 - 防止在呈现时旋转 viewController

iOS8 - prevent rotation on presenting viewController

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

MainViewController 仅限纵向,modalViewController 可以旋转。

问题出在iOS8,当modalViewController旋转时,调用MainViewcontroller中iOS8旋转的回调方法- - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

因此,UITableView 正在重新加载其数据,这是我们不希望出现的行为。

我们可以阻止 iOS 8 的这个功能,并且不旋转呈现的 UIViewController 吗?

经过长时间的搜索和调查,我终于想出了一个可能的解决方案。

首先,我可以使用导航控制器并推送 viewController 而不是显示它,但它破坏了我的代码而且事实并非如此。

我能做的第二件事是不设置约束。我仍然可以使用自动布局,但如果我不设置约束,并设置默认约束,则 tableView 不会重新加载。当然这也不是很明智的做法,因为我的 viewController.

中有很多元素

最后,我发现我可以在另一个 UIWindow 中显示这个 "modal" viewController。我创建了 UIWindow 并将 modalViewController 设置为它的 rootViewController。

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

希望对您有所帮助。

我用导航控制器做了一些事情similar,除非顶部推动的控制器确实旋转,否则它不会旋转。

在你的情况下,检查主控制器是否显示另一个控制器。如果不是,则拒绝旋转,否则 return 无论旋转方法所呈现的控制器如何 return。

至于您的 table 视图,它不应该 重新加载 因为旋转。

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