问题 iOS8 - 阻止呈现viewController时的旋转


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

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

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

因此,UITableView正在重新加载其数据,这是我们不想要的行为。

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


9260
2018-02-11 09:47


起源

在iOS7上是否完全调用回调?因为根据 文件 它是在iOS8上推出的 - Leonardo
在iOS7中@Leonardo一切都很好,这确实是我不想要的iOS8功能...... - oren
覆盖它并使它什么都不做 - Leonardo
你找到了解决方案吗? - Mathieu
@Mathieu请看下面的答案,我在git中做了示例项目。 - oren


答案:


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

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

我能做的第二件事就是不设置约束。我仍然可以使用autolayout,但是如果我没有设置约束,并且设置了默认约束,则不会重新加载tableView。当然这也不是很聪明的事情,因为我在viewController中有很多元素。

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

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

希望它会有所帮助。


11
2018-02-26 11:08



完善!!!这正是我所寻求的 - Oded Regev
这就是我一直在努力寻找的东西。非常感谢@oren - Bharat Jagtap
@ore​​n我在iOS 9上也有这个问题。解决方法是检查presentViewController - onmyway133


我做了点什么 类似 使用导航控制器,除非顶部推动控制器旋转,否则不会旋转。

在您的情况下检查主控制器是否正在显示另一个控制器。如果不是那么只是拒绝旋转,否则返回所呈现的控制器为旋转方法返回的任何内容。

至于你的表视图,它不应该得到 重装 因为轮换。


0
2018-02-26 11:51



我需要以模态方式呈现viewController,而不是推送viewController,我已经知道在推送viewController时它不会被旋转,请在发布问题之前阅读评论和其他答案。当在iOS8中呈现模态时,当呈现的viewController旋转时,所有屏幕都会旋转,它也会影响presentViewController。不管怎么说,还是要谢谢你 - oren
我读了这个问题,知道你要呈现,而不是推。我刚刚给你一个推动控制器的例子,它也可以与现有的控制器配合使用。 - Rivera
谢谢,我很感激。但我尝试了所有可能的解决方案,并没有为我工作。它看起来像呈现viewController不旋转,但确实如此,它的视图大小确实发生了变化。无论如何,我用额外的UIWindow解决了它。同时它就像一个魅力,但我仍然等待一些意想不到的行为...... :) - oren


在iOS 8中,更改设备方向时旋转的视图是添加到的第一个视图 UIWindow。所以,如果你在你的保存中保存一个引用 presentedController,你可以覆盖 shouldAutorotate 和 supportedInterfaceOrientations 值。


0
2018-03-04 15:48