【发布时间】:2014-08-28 14:56:41
【问题描述】:
我查看了 Stack Overflow 并没有找到任何可以解决我的确切问题的东西。我正在开发一个使用自定义选项卡视图在 4 个不同导航控制器之间切换的应用程序。我面临的问题是,当旋转设备然后切换到不同的选项卡时,变得可见的视图控制器仍然为旧方向布置。我一直在使用willRotateToInterfaceOrientation:duration: 来执行我想要使用新方向的任何特定方向的准备工作,当 VC 可见时,它按预期工作,但我知道不为不可见的视图控制器调用旋转方法在轮换时。
Apple 的文档说:
隐藏视图控制器时可能会发生旋转
如果发生旋转时视图控制器的内容不在屏幕上,则它不会看到旋转消息列表。例如,考虑以下事件序列:
- 您的视图控制器全屏显示另一个视图控制器的内容。
- 用户旋转设备以改变用户界面方向。
- 您的应用会关闭呈现的视图控制器。
在这个例子中,当旋转发生时呈现视图控制器是不可见的,因此它不会接收任何旋转事件。相反,当它重新出现时,它的视图会使用普通视图布局过程简单地调整大小和定位。如果您的布局代码需要知道设备的当前方向,它可以读取应用对象的 statusBarOrientation 属性来确定当前方向。
我想出了一些办法来解决这个问题,但我不确定什么是最好的。他们每个人都有自己的优点和缺点。我当前的解决方案基本上是将我在willRotateToInterfaceOrientation:duration: 中所做的任何事情复制到viewWillAppear 中,以便在发生旋转时不可见的视图控制器可以在新方向可见之前对其进行调整。我的另一个想法是将我的方向代码从willRotateToInterfaceOrientation:duration: 移动到viewWillLayoutSubviews 中,当视图控制器在可见时旋转时以及在不可见后变得可见时都会调用它。这样做的问题是即使没有发生旋转,布局方法也会被频繁调用。另一个选择是为UIDeviceOrientationDidChangeNotification 注册我的视图控制器,我想我的 VC 将收到无论它们是否可见,尽管我还没有对此进行测试。
我想这是一个很常见的问题,我想知道——其他人的解决方案是什么?有没有比我想出的解决方案更好的方法来处理这个问题?
谢谢!
【问题讨论】:
标签: ios objective-c uiviewcontroller rotation screen-rotation