如何在IOS 8中强制查看控制器方向?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

在iOS 8之前,我们将以下代码与支持接口定向应自旋委托方法强制应用程序定向到任何特定方向。我使用下面的代码片段以编程方式将应用程序旋转到所需的方向。

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

但这在iOS 8中是失败的。此外,我在堆栈溢出中看到了一些答案,人们建议我们应该从iOS 8开始始终避免这种方法。

更具体地说,我的应用程序是一种通用的应用程序类型。总共有三个控制器。

  1. 第一视图控制器-它应该支持iPad的所有方向,只支持iPhone的纵向(按下主页按钮)。
  2. 第二视图控制器-在任何情况下都应支持景观权
  3. 第三视图控制器-在任何情况下都应支持景观权

我们使用导航控制器进行页面导航。从第一个视图控制器,在一个按钮单击操作,我们推动第二个在堆栈上。因此,当第二个视图控制器到达时,不管设备的方向如何,应用程序应该只锁定在景观右侧。

下面是我的shouldAutorotatesupportedInterfaceOrientations方法在第二视图控制器和第三视图控制器中。

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscapeRight;
}

-(BOOL)shouldAutorotate {
    return NO;
}
提问于
用户回答回答于

对于IOS 7-10:

目标-C:

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeLeft) forKey:@"orientation"];

SWIFT 3:

let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")

就叫它来- viewDidAppear:视图控制器。

用户回答回答于

如果在一个UINavigationControllerUITabBarController,问题是,如果视图控制器被嵌入其中一个控制器中,导航或制表符控制器将优先考虑,并就自动旋转和支持的方向做出决策。

我在UINavigationController和UITabBarController上使用了以下两个扩展,这样嵌入在其中一个控制器中的视图控制器就可以做出决策。

给视图控制器权力!

SWIFT 2.3

extension UINavigationController {
    public override func supportedInterfaceOrientations() -> Int {
        return visibleViewController.supportedInterfaceOrientations()
    }
    public override func shouldAutorotate() -> Bool {
        return visibleViewController.shouldAutorotate()
    }
}

extension UITabBarController {
    public override func supportedInterfaceOrientations() -> Int {
        if let selected = selectedViewController {
            return selected.supportedInterfaceOrientations()
        }
        return super.supportedInterfaceOrientations()
    }
    public override func shouldAutorotate() -> Bool {
        if let selected = selectedViewController {
            return selected.shouldAutorotate()
        }
        return super.shouldAutorotate()
    }
}

SWIFT 3

extension UINavigationController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return visibleViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
    }

    open override var shouldAutorotate: Bool {
        return visibleViewController?.shouldAutorotate ?? super.shouldAutorotate
    }
}

extension UITabBarController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if let selected = selectedViewController {
            return selected.supportedInterfaceOrientations
        }
        return super.supportedInterfaceOrientations
    }

    open override var shouldAutorotate: Bool {
        if let selected = selectedViewController {
            return selected.shouldAutorotate
        }
        return super.shouldAutorotate
    }
}

现在可以覆盖supportedInterfaceOrientations方法,或者可以重写shouldAutoRotate在视图控制器中,想要锁定,否则可以省略在其他视图控制器中的重写,希望继承应用程序的plist中指定的默认定向行为。

禁用旋转

class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }
}

Lock to Specific Orientation

class ViewController: UIViewController {
    override func supportedInterfaceOrientations() -> Int {
        return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }
}

理论上,这应该适用于所有复杂的视图控制器层次结构,但我注意到了UITabBarController的一个问题。

扫码关注云+社区