【发布时间】:2012-09-19 18:27:19
【问题描述】:
我有一个 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 方法中,但它什么也没做。这是错误的调用方法还是错误的调用位置,或者我应该以完全不同的方式实现整个事情?
【问题讨论】:
标签: ios iphone ios6 autorotate