我有一个iPhone应用程序,该应用程序使用UINavigationController
来显示向下钻取的界面:首先是一个视图,然后是另一个视图,最多可以看到四个层次。我希望将前三个视图限制为纵向,并且仅应允许最后一个视图旋转为横向。从第四视图返回到第三视图时,我希望所有内容都旋转回纵向。
在iOS 5中,我仅shouldAutorotateToInterfaceOrientation:
在每个视图控制器中定义为允许的方向返回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
我的第三个视图控制器的方法中,但是它什么也没做。这是错误的调用方法还是错误的调用位置,还是我应该以完全不同的方式实现整个过程?