如何将控制器保持在一个方向上?

时间:2018-10-05 01:32:48

标签: ios swift

我有两个类,它们是UIViewController的子类。 PortraitViewControllerLandscapeViewController

这些类的变量shouldAutorotatesupportedInterfaceOrientationspreferredInterfaceOrientationForPresentation具有重写实现,因此可以相应地坚持纵向或横向。

我的应用程序接受纵向和横向模式。

现在,我还有:

  1. ViewController1PortraitViewController的子类
  2. ViewController2LandscapeViewController的子类

当我显示ViewController1并附有UINavigationController时,它会像预期的那样保持纵向。

当我显示ViewController2并附有UINavigationController时,作为ViewController1上方的模态导航,它会像预期的那样保持风景。

UINavigationController有一个扩展名,它也覆盖了上面提到的vars,但是它从visibleController参数中读取属性。

但是当我解雇ViewController2时,ViewController1出现在横向。

无论我在顶部显示什么,如何使ViewController1停留在纵向模式?

注:每次设备处于纵向模式时。

编辑:

这是一个演示项目:https://www.dropbox.com/s/ishe88e1x81nzlp/DemoOrientationApp.zip?dl=0

2 个答案:

答案 0 :(得分:1)

visibleViewController是导航堆栈的顶部视图控制器,或者是导航控制器提供的视图控制器。

因此,当您显示第二个导航控制器时,第一个导航控制器将读取第二个导航控制器属性,该属性将传回景观视图控制器的属性。

您需要使用的是topViewController。这样,该设置将限于视图控制器堆栈。

答案 1 :(得分:0)

好的,所以:

丢弃UINavigationControllerExtension。

更改您的Info.plist,以便我们仅以纵向启动:

enter image description here

(删除项目1和2。)

在应用程序委托中,添加以下代码,以允许我们在启动后旋转到横向

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return .all
}

在ViewController中,修改代码如下:

class ViewController: PortraitViewController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.delegate = self
    }
    func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
        return self.supportedInterfaceOrientations
    }
    @IBAction func showView(_ sender: Any) {
        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
        let nav = UINavigationController(rootViewController: vc)
        nav.delegate = vc
        present(nav, animated: true, completion: nil)
    }
}

在ViewController2中,修改代码如下:

class ViewController2: LandscapeViewController, UINavigationControllerDelegate {
    func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
        return self.supportedInterfaceOrientations
    }
    func navigationControllerPreferredInterfaceOrientationForPresentation(_ navigationController: UINavigationController) -> UIInterfaceOrientation {
        return self.preferredInterfaceOrientationForPresentation
    }
    @IBAction func dismiss(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
}

该应用程序现在可以按预期运行。