在iOS 7上为单个呈现的ViewController禁用自动旋转

时间:2014-03-28 14:46:20

标签: ios objective-c cocoa-touch uiviewcontroller

我有一个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];
}

2 个答案:

答案 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;部署信息选项卡,仅选择横向左侧和右侧选择。如果您的所有观看只需要一种方向,这可能是一种更好的方法。