我有一个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];
}
答案 0 :(得分:5)
所以我只是尝试了你的代码,它让我相信你在UIViewController
中展示了你的UINavigationController
。无论出于何种原因,iOS 7改变了UINavigationController
处理轮换的方式。
最简单的解决方案是创建一个UINavigationController
的子类,它覆盖shouldAutorotate
方法并返回topViewController中的值。
@interface CustomNavigationController : UINavigationController
@end
@implementation CustomNavigationController
- (BOOL)shouldAutorotate
{
return [[self topViewController] shouldAutorotate];
}
@end
因此,viewController
是您的NO
返回shouldAutorotate
的对象,而不是这样做。
UINavigaitonController *navController = [UINavigationController alloc] initWithRootViewController:viewController];
[self presentViewController:navController animated:YES completion:nil];
您可以使用CustomNavigationController
CustomNavigationController *customNavController = [CustomNavigationController alloc] initWithRootViewController:viewController];
[self presentViewController:customNavController animated:YES completion:nil];
答案 1 :(得分:-1)
#import <objc/message.h>
-(void)viewDidAppear:(BOOL)animated{
objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );
}
请参阅How do I programmatically set device orientation in iOS7?
但请注意您使用此方法的情况,因为它是私有API,Apple可能会拒绝您的应用。因此,最好从项目详细信息设置方向 - &gt;一般 - &gt;部署信息选项卡,仅选择横向左侧和右侧选择。如果您的所有观看只需要一种方向,这可能是一种更好的方法。