这个问题是关于 iOS 设备旋转和 UINavigationController 中的多个受控视图。有些观点应该是仅限于纵向方向,有些应该自由自转。如果您尝试使用三个视图创建最简单的设置,您会注意到自动旋转行为有一些非常令人讨厌的怪癖。然而,这个场景非常简单,所以我认为我要么没有正确执行自动旋转实现,要么我忘记了一些东西。
我有一个非常基本的演示应用程序,它展示了它的怪异之处,我制作了一个视频来展示它的实际情况。
- 下载应用程序(XCode 项目) http://grabs.epologee.com/86a550fe0c65cd7d8ab0b3c346a342f7.zip
- 将课程视为要点(相当冗长) https://gist.github.com/b8670e5976635a629842
- 观看问题视频(YouTube,2分43秒) http://www.youtube.com/watch?v=pugXOhTbJaY
设置非常基本:三个视图控制器称为FirstViewController
, SecondViewController
and ThirdViewController
全部延伸一个AbstractViewController
显示带有类名的标签,并返回 YESshouldAutorotateToInterfaceOrientation:
当设备处于纵向时。 SecondViewController 重写此方法以允许所有旋转。所有三个具体类都添加了一些彩色方块,以便能够通过将控制器推入/弹出来在视图之间导航。UINavigationController
。我想说,到目前为止,这是一个非常简单的场景。
如果您以纵向或横向方向握住设备,这就是我不仅想要实现而且也期望的结果。在第一个图像中,您看到所有视图都是“直立”的,在第二个图像中,您看到只有第二个视图控制器反向旋转设备的方向。需要明确的是,应该可以从横向模式下的第二个视图导航到第三个视图,但由于第三个视图仅支持纵向方向,因此它应该仅以纵向方向显示。查看结果是否正常的最简单方法是查看承载杆的位置。
但这个问题就在这里,因为实际结果完全不同。根据您旋转设备时所处的视图以及您接下来导航到的视图,视图将不会旋转(具体来说,didOrientFromInterfaceOrientation:
方法从未被调用)。如果您在第二个屏幕上处于横向状态并导航到第三个屏幕,它将与第二个屏幕具有相同的方向(=坏)。然而,如果您从第二个导航回到第一个,屏幕将旋转为“强制”纵向模式,并且无论您如何握住它,载体栏都将位于设备的物理顶部。视频更详细地展示了这一点。
我的问题有两个:
- 为什么第一个视图控制器旋转回来,而不是第三个?
- 当您只希望某些视图自动旋转而不希望其他视图自动旋转时,需要做什么才能从视图中获得正确的行为?
干杯,
EP。
编辑:作为悬赏之前的最后手段,我完全重写了这个问题,使其更短、更清晰,并希望更吸引人给出答案。
简短的答案是您正在使用 UINavigationController,并且它不会像您希望的那样工作。来自苹果的文档:
为什么我的 UIViewController 不随设备旋转?
您的所有子视图控制器
UITabBarController 或
UINavigationController 不同意
一个共同的方向集。
为了确保您的所有孩子都能看到
控制器正确旋转,您必须
实施
应该自动旋转到界面方向
对于每个视图控制器代表
每个选项卡或导航级别。每个
必须就相同的方向达成一致
旋转发生。也就是说,他们
对于相同的情况,所有人都应该返回 YES
定向位置。
您可以阅读更多有关在这里查看轮换问题 http://developer.apple.com/library/ios/#qa/qa2010/qa1688.html.
您必须为您想做的事情滚动自己的视图/控制器堆栈管理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)