我有一个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];
}
supportedInterfaceOrientations
来控制自动旋转过程,就像早期版本使用的shouldAutorotateToInterfaceOrientation:
一样。如果您在UITabController
中呈现视图控制器,也可能会遇到问题。 - David BerryUIViewController
жҳҜеҗҰеңЁUINavigationController
дёӯиў«е‘ҲзҺ°пјҹ - Craig Siemens