我有一个 iPhone 应用程序,它使用 aUINavigationController
来呈现向下钻取界面:首先是一个视图,然后是另一个视图,最多四层深度。我希望将前三个视图限制为纵向,并且只允许最后一个视图旋转到横向。当从第四个视图返回到第三个视图并且第四个视图处于横向时,我希望所有内容都旋转回纵向。
在 iOS 5shouldAutorotateToInterfaceOrientation:
中,我只是在每个视图控制器中定义为允许的方向返回 YES。一切都如上所述,包括从视图控制器 #4 返回到 #3 时,即使设备处于横向状态,也可以返回纵向。
在 iOS 6 中,所有视图控制器都旋转为横向,破坏了那些不应该这样做的。iOS 6 发行说明说
更多的责任正在转移到应用程序和应用程序委托身上。现在,iOS 容器(例如
UINavigationController
)不会咨询它们的子容器来确定它们是否应该自动旋转。[...] 每当设备旋转或视图控制器以全屏模式呈现样式呈现时,系统都会向最顶层的全屏视图控制器(通常是根视图控制器)询问其支持的界面方向。此外,仅当此视图控制器从其shouldAutorotate
方法返回 YES 时才会检索支持的方向。supportedInterfaceOrientationsForWindow:
[...] 系统通过将应用程序的方法返回的值与supportedInterfaceOrientations
最顶层全屏控制器的方法返回的值相交来确定是否支持方向。
所以我进行了子类化UINavigationController
,给了我MainNavigationController
一个布尔属性landscapeOK
并用它来返回允许的方向supportedInterfaceOrientations
。然后在我的每个视图控制器的viewWillAppear:
方法中,我都有这样的一行
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
告诉我MainNavigationController
想要的行为。
问题来了:如果我现在以纵向模式导航到我的第四个视图并将手机翻过来,它会旋转到横向。现在我按下后退按钮返回到我的第三个视图,该视图应该只用于纵向。但它不会旋转回来。我如何让它做到这一点?
我试过了
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
在viewWillAppear
我的第三个视图控制器的方法中,但它什么也没做。这是错误的调用方法还是错误的调用位置,或者我应该以完全不同的方式实现整个事情?