代码之家  ›  专栏  ›  技术社区  ›  Felipe Peña

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

  •  0
  • Felipe Peña  · 技术社区  · 6 年前

    UIViewController . PortraitViewController LandscapeViewController

    这些类有它们的变量 shouldAutorotate supportedInterfaceOrientations preferredInterfaceOrientationForPresentation 使用覆盖实现,因此它们可以相应地坚持纵向或横向方向。

    现在,我还有:

    1. ViewController1 哪些子类来自 人像视图控制器
    2. ViewController2 哪些子类来自 景观控制器

    当我出现的时候 视图控制器1 用一个 UINavigationController

    当我出现的时候 用一个 导航控制器 视图控制器1 ,与风景如出一辙。

    有个分机 导航控制器 它也覆盖上面提到的变量,但是它从 visibleController 参数。

    但当我解散 , 出现在风景中。

    我该怎么做 视图控制器1 坚持在肖像模式,不管我在上面显示什么?

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

    编辑:

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ken Boreham    6 年前

    visibleViewController是导航堆栈的俯视图控制器或导航控制器提供的视图控制器。

    因此,当您呈现第二个导航控制器时,第一个导航控制器将读取第二个导航控制器属性,该属性将传递回横向视图控制器的属性。

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

        2
  •  0
  •   matt    6 年前

    好吧,那么:

    扔掉你的UINavigationControllerExtension。

    更改您的Info.plist,以便我们只启动到肖像:

    enter image description here

    (删除第1项和第2项。)

    在app delegate中,添加以下代码,以允许我们旋转到横向 启动:

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

    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)
        }
    }
    

    现在,应用程序的行为符合要求。