当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

Posted

技术标签:

【中文标题】当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新【英文标题】:iOS 6 view controller layout doesn't update after orientation change when covered by a modal view controller 【发布时间】:2012-11-10 19:47:20 【问题描述】:

我有一个 iPad 应用程序,它适用于 6 之前的 ios 版本。

我的根视图控制器显示一个列表,当您单击列表中的任何项目时,根视图控制器会呈现一个模态视图控制器以显示项目的详细信息。

问题是,我的根视图控制器在横向和纵向上有不同的布局,当没有模态视图控制器存在时,它在方向改变时更新布局完全没有问题,但是当被模态视图控制器覆盖时,它不会更新,而且这只发生在 iOS 6 上。因此,当您单击一个项目时,模态视图控制器会出现覆盖整个屏幕,然后您旋转设备,然后关闭模态视图控制器,即根视图控制器仍然是旧的方向布局,这真的很烦人。

我很清楚在 iOS 6 中不推荐使用 shouldAutorotateToInterfaceOrientation 的更改,并且全屏模式视图控制器所涵盖的任何视图控制器都不会像在 iOS 6 之前那样接收旋转事件。我做了这个建议线程:iOS 6 Rotation issue - No rotation from Presented Modal View Controller,这是手动将旋转事件从模态视图控制器传递到它后面的视图控制器,但它后面的视图控制器仍然没有更新它的布局。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

将所有轮换逻辑移至viewDidLayoutSubviews。就这么简单,您将获得与以前相同的功能。将会发生的是,在您关闭模态视图控制器后,呈现视图将是布局,然后您可以切换到当前方向的适当布局。

【讨论】:

谢谢!这确实使我找到了正确的解决方案!经过一番挖掘,我发现真正的问题是时机。我将呈现视图控制器设为“模态视图已解除”委托,在模态视图控制器被解除后立即调用该委托。问题是,这是在 viewDidLayoutSubviews 之前调用的,所以我在委托中得到了错误的坐标。现在我在获得坐标之前在我的委托中调用 [view layoutSubviews],这解决了问题!

以上是关于当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新的主要内容,如果未能解决你的问题,请参考以下文章

如何更改模态视图 iOS 6 上的状态栏

模态视图控制器在 iOS 7 上工作,在 iOS 6 上留下一个空白

iOS 6.1 中用于自定义相机视图的自动旋转

模态下的弹出/推送视图

iOS - 半透明模态视图控制器

模态显示的表格视图没有导航栏