这个问题是关于 iOS 设备旋转和 UINavigationController 中的多个受控视图。有些视图应该被限制为纵向,有些应该可以自由地自动旋转。如果您尝试使用三个视图创建最简单的设置,您会注意到自动旋转行为有一些非常讨厌的怪癖。然而,这个场景非常简单,所以我认为我要么没有正确地执行自动旋转,要么我忘记了一些东西。
我有一个非常基本的演示应用程序,它展示了它的奇怪之处,我制作了一个视频来展示它的实际效果。
设置非常基本:三个视图控制器称为FirstViewController
,SecondViewController
并且ThirdViewController
都扩展了一个AbstractViewController
显示带有类名称的标签,并且shouldAutorotateToInterfaceOrientation:
当设备处于纵向时返回 YES。SecondViewController 覆盖 this 方法以允许所有旋转。所有三个具体类都添加了一些彩色方块,以便能够通过将控制器推入/弹出UINavigationController
. 到目前为止,我会说一个非常简单的场景。
如果您以纵向或横向方向握住设备,这就是我不仅想要实现的结果,而且也是期望的结果。在第一张图片中,您看到所有视图都是“直立的”,而在第二张图片中,您看到只有第二个视图控制器反向旋转了设备的方向。需要明确的是,应该可以从横向模式下的第二个视图导航到第三个视图,但是因为第三个仅支持纵向,所以它应该只以纵向显示。查看结果是否正常的最简单方法是查看载条的位置。
但是这个问题在这里,因为实际结果完全不同。根据您旋转设备时所处的视图,以及根据您接下来导航到的视图,视图不会旋转(具体而言,该didOrientFromInterfaceOrientation:
方法永远不会被调用)。如果您在第二个中处于横向并导航到第三个,它将具有与第二个相同的方向(=坏)。但是,如果您从第二个导航回第一个,屏幕将旋转到“强制”纵向模式,并且载体栏将位于设备的物理顶部,无论您如何握住它。视频更详细地展示了这一点。
我的问题是双重的:
- 为什么第一个视图控制器旋转回来,而不是第三个?
- 当您只希望某些视图自动旋转而不希望其他视图自动旋转时,需要做什么才能从您的视图中获得正确的行为?
干杯,EP。
编辑:作为悬赏之前的最后手段,我完全重写了这个问题,使其更短、更清晰,并希望能更有吸引力地给出答案。