显示模态视图控制器时设备旋转

Posted

技术标签:

【中文标题】显示模态视图控制器时设备旋转【英文标题】:Device rotation while displaying modal view controller 【发布时间】:2011-10-25 02:03:43 【问题描述】:

我有一个支持动态设备方向的 OpenGL 应用程序。我可以将设备旋转到 4 个物理方向中的任何一个,一切正常。

现在我添加了一个模态视图控制器,以便您可以获得设置视图(这是非 OpenGL)。模态视图控制器还支持任何设备方向。

但是,如果我在方向 A(例如纵向)中显示模态视图控制器并在方向 B(例如横向-右)中将其关闭,则在它被关闭后,OpenGL 视图已损坏(纵横比看起来错误)。我必须将设备定向到不同的方向,以便 OpenGL 视图自行“纠正”。

当模态视图控制器被关闭时,就像应用认为它已经在方向 B,所以它永远不会旋转 OpenGL 视图。

如果我在模态视图控制器上禁用旋转,那么如果我在方向 A 中显示模态控制器,将设备旋转到方向 B(模态视图控制器不再旋转)并关闭控制器,OpenGL 视图将获得 willRotateToInterfaceOrientation/ didRotateFromInterfaceOrientation 并正确定向到方向 B。

有什么方法可以保持模态控制器的动态方向,但在模态控制器关闭后,OpenGL 视图也能正确旋转吗?

谢谢。

【问题讨论】:

您使用哪种机制来检测旋转变化以更新您的 OpenGL 视图?是什么管理可能调整其框架的 OpenGL 视图的呈现? shouldAutorotateToInterfaceOrientation 用于 OpenGL 视图控制器返回 YES。 willRotateToInterfaceOrientation 在 OpenGL 视图控制器上被调用。 layoutSubviews 在 OpenGL 视图上调用,释放 OpenGL 缓冲区。下次调用渲染函数时,OpenGL 缓冲区会以交换的宽度/高度重新创建。 当模态框固定为纵向时,您是如何使其工作的?我也有同样的问题 【参考方案1】:

我在自定义操作表中遇到了类似的问题,并决定最简单的答案是在显示视图时暂时禁止旋转。您可以在 Apple Notes 应用程序中看到这样的示例,每当显示操作表时,方向就会被锁定。

我知道您已经尝试过这个并且它有效,我只是认为您应该将其视为一个有效的解决方案。

我不知道如何解决它,您可能需要将任何方向更改存储在模态视图控制器中,并将它们同时或一次传递回 OpenGL 视图控制器关闭设置视图,然后手动重新渲染。

【讨论】:

以上是关于显示模态视图控制器时设备旋转的主要内容,如果未能解决你的问题,请参考以下文章

旋转设备时表格视图更新无效

模态 VC 和旋转的自定义背景

使用自定义模式 UIViewControllerTransitioningDelegate 进行旋转

iPad 模态控制器在旋转后被解散

模态视图控制器的呈现视图控制器不旋转

iPad 模态视图控制器以纵向动作,即使它是横向的