设备旋转时切换视图控制器

时间:2016-05-20 12:31:44

标签: ios xcode swift uiviewcontroller

我有两个视图控制器;一个用于风景,另一个用于肖像。 如何在设备旋转时以编程方式切换这些,就像本机iPhone计算器一样。

此外,纵向和横向视图控制器在xcode和swift中彼此不同。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

处理此类事物的现代方法是让一个控制器适应不同的尺寸,不仅可以处理各种可能的屏幕尺寸,还可以处理iPad的Slide Over和Split View多任务处理。您应该对UI进行重大更改,例如计算器示例是按大小类区分,在此处说明:

Size-Class-Specific Layout

  

Interface Builder中的故事板默认使用大小类。大小类是分配给用户界面元素的特征,如场景或视图。它们粗略地指示了元素的大小。 Interface Builder允许您根据当前大小类自定义许多布局功能。然后,布局会随着大小类的变化自动调整。具体来说,您可以基于每个大小的类设置以下功能:

     
      
  • 安装或卸载视图或控件。
  •   
  • 安装或卸载约束。
  •   
  • 设置选择属性的值(例如,字体和布局边距设置)。
  •   
     

当系统加载场景时,它会实例化所有视图,控件和约束,并将这些项目分配给视图控制器中的相应插座(如果有)。无论场景的当前大小等级如何,您都可以通过其出口访问这些项目。但是,只有在为当前大小类安装这些项目时,系统才会将这些项目添加到视图层次结构中。

     

当视图的大小类发生更改时(例如,当您在全屏和拆分视图之间旋转iPhone或切换iPad应用程序时),系统会自动向视图层次结构添加项目或从视图层次结构中删除它们。系统还会动画对视图布局的任何更改。

可以在raywenderlich.com找到优秀的教程:

答案 1 :(得分:1)

有时需要显示另一个控制器。 注意:.compact trait是所有iPhone的景观。 我是这样做的:

    lazy var switchViewController: UIViewController? = {

        let vc = self.storyboard?.instantiateViewController(withIdentifier: "SwitchViewController")
        vc?.modalTransitionStyle = .crossDissolve
        return vc
    }()

    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orientation = newCollection.verticalSizeClass

            switch orientation {
            case .compact:
                self.present(self.switchViewController!, animated: true, completion: .none)

            default:
                self.switchViewController!.dismiss(animated: true, completion: .none)
            }
        }, completion: .none)

        super.willTransition(to: newCollection, with: coordinator)
    }

答案 2 :(得分:0)

您不需要为这些使用不同的UIViewControllers。您只需要覆盖UIViewController的一些方法,以便在更改设备方向时修改UI。

您可以关注以下链接:
tutorial 1
tutorial 2