如何为某些视图控制器锁定iPhone的方向 - Swift?

时间:2017-05-05 02:34:21

标签: ios iphone swift model-view-controller screen-orientation

我有2个视图控制器,VC1和VC2。

VC1目前以模态方式呈现VC2。

VC1唯一的方向应该是纵向,但VC2可以具有所有方向。

问题是当我在VC2中并且我旋转到横向模式然后解雇时,VC1也处于横向模式!这绝不应该发生!

注意:没有导航控制器或UITabbarcontroller

我正在添加我的代码。

Appdelagate

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
        if (rootViewController.responds(to: Selector(("canRotate")))) {
            // Unlock landscape view orientations for this view controller
            return .allButUpsideDown
        }
    }

    // Only allow portrait (standard behaviour)
    return .portrait;
}

private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
    if (rootViewController == nil) { return nil }
    if (rootViewController.isKind(of: (UITabBarController).self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
    } else if (rootViewController.isKind(of:(UINavigationController).self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
    } else if (rootViewController.presentedViewController != nil) {
        return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
    }
    return rootViewController
}

VC2 中的代码:

 override func viewDidLoad() {
        super.viewDidLoad()
        UIDevice.current.setValue(Int(UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
}

func canRotate() -> Void {}

链接到我寻求帮助的地方并找到了此代码 Website where I found Code

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:6)

您需要按照以下步骤锁定特定ViewControllers的旋转: -

Step 1:在创建项目时,允许所有方向。请勿在下方图片中选择任何内容。 enter image description here Step 2:如果你想让VC1只有Portrait Orientation,那么你可以在ViewController类中添加以下两个函数

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.all //return the value as per the required orientation 
    }

override var shouldAutorotate: Bool {
        return false
    }

Step 3:如果您希望VC2拥有所有方向,请不要为其添加任何代码。

所以结论: -

在项目设置中,允许整个项目的所有方向。限制应该在ViewControllers级别,而不是在项目级别。

如果您希望任何VC具有所有方向,则不要编写任何代码。

如果您希望任何VC具有特定方向,请执行上述两个功能。