iOS 7 未调用supportedInterfaceOrientations

Posted

技术标签:

【中文标题】iOS 7 未调用supportedInterfaceOrientations【英文标题】:supportedInterfaceOrientations not called with iOS 7 【发布时间】:2014-01-13 10:26:49 【问题描述】:

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

所以问题来了: 我有一个自定义 UINavigationController,在创建它时在 rootViewController 上调用 supportedInterfaceOrientations 方法(仅支持纵向)。 但是当将另一个 ViewController 推入堆栈时,不会在推入的 ViewController 上调用此方法(支持除了倒置之外的所有内容)。

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

我希望你能在这件事上帮助我。

这是我在第二个 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];
        
    

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

这有帮助,但是现在从纵向旋转到横向时会出现一个问题,第一次旋转在我的导航控制器上调用supportedInterfaceOrientations,但是旋转没有完成,只有在第二次旋转到横向旋转正确完成 第一次/第二次的问题你找到解决办法了吗?我也有同样的问题【参考方案2】:

这在 ios 8 中运行良好。

但在 iOS 9 (Xcode 7) 中,我变成了一个警告: “在实现 'supportedInterfaceOrientations' 时返回类型冲突:'UIInterfaceOrientationMask'(又名'enum UIInterfaceOrientationMask')与'NSUInteger'(又名'unsigned long')”

我已将其更改为:

-(UIInterfaceOrientationMask)supportedInterfaceOrientations  
     return UIInterfaceOrientationMaskPortrait;  

【讨论】:

【参考方案3】:

所选答案的 Swift 版本:

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

【讨论】:

以上是关于iOS 7 未调用supportedInterfaceOrientations的主要内容,如果未能解决你的问题,请参考以下文章

Socket.IO 命名空间,调用未定义函数 .of()

Titanium Facebook 模块未在 iOS 7 上完成登录

iOS 7 Google AdMob 未出现

将设备更新到 iOS 14.7.1 后,iOS Flutter 应用程序未运行

在 iOS 13 上未调用 didConnectPeripheral 委托

iPhone标签栏图标未对齐 - iOS 7