【发布时间】:2014-03-28 14:46:20
【问题描述】:
我有一个UIViewController,它以模态方式(全屏)显示,我想在该视图中禁用自动旋转。我不想将其限制为横向或纵向,只是希望它保持最初呈现的任何方向。
在 iOS 6 上,只需覆盖该方法就足够了:
- (BOOL)shouldAutorotate {
return NO;
}
它完全符合我的要求。然而,在 iOS 7 上,这似乎没有效果。该方法确实被调用了,但返回值似乎被操作系统忽略了——无论如何它都会自动旋转。
文档没有提到对此方法的任何更改。如何在 iOS 7 上达到想要的效果?
编辑:视图控制器由UINavigationViewController 呈现(而不是推送!):
[self.navigationController presentViewController:vc animated:YES completion:nil];
解决方案:
尽管看起来很奇怪,但该解决方案并未在有关该主题的众多现有问题中发布。在 iOS 7 上,UINavigationController 似乎给出了答案
shouldAutorotate 是操作系统的作用。我们需要继承UINavigationController 来修改它的行为。
在处理常规导航堆栈时,只使用[self.topViewController shouldAutorotate] 确实足够了,但是当有模态视图时,它驻留在self.presentedViewController,而不是self.topViewController。因此完整的解决方案如下所示:
- (BOOL)shouldAutorotate {
UIViewController *vc;
if (self.presentedViewController) vc = self.presentedViewController;
else vc = [self topViewController];
return [vc shouldAutorotate];
}
【问题讨论】:
-
iOS7 使用视图控制器方法
supportedInterfaceOrientations来控制自动旋转过程,就像早期版本使用shouldAutorotateToInterfaceOrientation:一样,如果您在UITabController中显示视图控制器,您也可能会遇到问题. -
您的
UIViewController是否出现在UINavigationController中? -
这不是那个问题的重复。该问题询问在 iOS 6 中执行此操作,但我的问题是关于在 iOS 6 中完美运行但在 iOS 7 下出现问题的代码。
标签: ios objective-c cocoa-touch uiviewcontroller