我有一个 iPhone 应用程序,它使用一个 UINavigationController
来呈现一个向下钻取的界面: 首先是一个视图,然后是另一个,深达四层。我希望前三个视图仅限于肖像方向,只有最后一个视图应允许旋转到景观。当从第四视图返回到第三视图和第四视图是在横向方向,我希望一切旋转回肖像。
在 iOS5中,我简单地在每个视图控制器中定义了 shouldAutorotateToInterfaceOrientation:
,以返回允许的方向的 YES。一切工作如上所述,包括返回到肖像,即使设备正在举行横向时,从视图控制器 # 4返回 # 3。
在 iOS6中,所有的视图控制器都可以旋转到横向,打破那些不应该旋转的视图控制器。IOS6的发布说明中写道
更多的责任转移到应用程序和应用程序委托。现在,iOS 容器(如
UINavigationController
)不会咨询它们的子容器来决定是否应该自动旋转。[ ... ]当设备旋转或视图控制器呈现全屏模式表示风格时,系统要求最顶端的全屏视图控制器(通常是根视图控制器)提供其支持的界面方向。而且,只有当这个视图控制器从它的shouldAutorotate
方法返回 YES 时,才能检索到支持的方向。[ ... ]系统通过将应用程序的supportedInterfaceOrientationsForWindow:
方法返回的值与最顶端全屏控制器的supportedInterfaceOrientations
方法返回的值相交来确定是否支持方向。
所以我子类化了 UINavigationController
,给了我的 MainNavigationController
一个布尔属性 landscapeOK
,并使用它返回 supportedInterfaceOrientations
中允许的方向。然后在每个视图控制器的 viewWillAppear:
方法中都有一行这样的代码
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
告诉我的 MainNavigationController
想要的行为。
问题来了: 如果我现在导航到我的第四个视图在肖像模式,把手机在它旋转到横向。现在我按后退按钮返回到我的第三个视图,这应该是工作肖像只。但它不会回转。我怎么才能做到呢?
我尽力了
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
在我的第三个视图控制器的 viewWillAppear
方法中,但是它什么也不做。这是一个错误的调用方法,还是一个错误的调用位置,或者我应该用一种完全不同的方式来实现整个过程?