supportedInterfaceOrientations未使用iOS 7调用

时间:2014-01-13 10:26:49

标签: ios objective-c ios7 uinavigationcontroller orientation

我搜索了一个答案,但找不到任何解决我问题的方法。

所以这就是问题所在: 我有一个自定义的UINavigationController,在创建它时,在rootViewController上调用supportedInterfaceOrientations方法(仅支持肖像)。 但是当将其他ViewController推入堆栈时,不会在推送的ViewController上调用此方法(支持所有ViewController除了颠倒)。

我通过在[self supportedInterfaceOrientations] - 方法中调用viewDidLoad来解决它,但我认为这不是解决问题的好方法。

我希望你能帮助我。

这是我在第二个viewController中实现的代码。

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [[[UIApplication sharedApplication] delegate] setGlobalOrientationMask:UIInterfaceOrientationMaskAllButUpsideDown];
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else {
        [[[UIApplication sharedApplication] delegate] setGlobalOrientationMask:UIInterfaceOrientationMaskAll];
        return UIInterfaceOrientationMaskAll;
    }
}

我认为来自johnMa的解决方案应该适用于大多数应用程序,但在我的情况下,我认为有一个特殊问题,但我现在自己解决了(不确定它是否是一个好的,但它有效)。

我在navigationController-delegate上实现了- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated方法。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (DEF_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7")) {
        if ([viewController respondsToSelector:@selector(supportedInterfaceOrientations)]) {
            [viewController supportedInterfaceOrientations];
        }
    }
}

我希望这可以帮助其他人解决同样的问题。

3 个答案:

答案 0 :(得分:13)

您应该在自定义NavigationController中实现这些代码。

 - (NSUInteger)supportedInterfaceOrientations {
    if ([self.topViewController isMemberOfClass:[RootViewController class]]){
        return UIInterfaceOrientationMaskPortrait;
    }else{
        return UIInterfaceOrientationMaskAllButUpsideDown;
   }  
 }

因为当您的设备旋转时,如果supportedInterfaceOrientations未在那里实现,它将首先询问您的应用rootController(Custom NavigationController)。然后它会询问rootController supportedInterfaceOrientations

  

作为主窗口的根视图控制器或在主窗口上全屏显示的视图控制器可以声明它支持的方向。View Controller Programming Guide

答案 1 :(得分:2)

这在iOS 8中运行良好。

但在iOS 9(Xcode 7)中我成了警告: "实施“支持的接口方向”' UIInterfaceOrientationMask'' UIInterfaceOrientationMask' (又名' enum UIInterfaceOrientationMask')vs' NSUInteger' (又名' unsigned long')"

我已将其更改为:

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{  
     return UIInterfaceOrientationMaskPortrait;  
}

答案 2 :(得分:0)

所选答案的快速版本:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if self.topViewController is ViewController {
        return .Portrait
    } else {
        return .All
    }
}