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

Posted

技术标签:

【中文标题】设备旋转时切换视图控制器【英文标题】:Switching view controller when device rotates 【发布时间】:2016-05-20 12:31:43 【问题描述】:

我有两个视图控制器;一个用于横向,另一个用于纵向。 当设备旋转时,如何以编程方式切换这些,就像原生 iPhone 计算器一样。

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

任何帮助将不胜感激。

【问题讨论】:

旋转时不需要改变viewController,可以使用size类修改UIViewController旋转时的UI。 纵向和横向视图控制器也彼此不同“新编辑” 【参考方案1】:

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

Size-Class-Specific Layout

默认情况下,Interface Builder 中的故事板使用大小类。大小类是分配给用户界面元素(如场景或视图)的特征。它们提供了元素大小的粗略指示。 Interface Builder 允许您根据当前的尺寸等级自定义布局的许多功能。然后布局会随着尺寸等级的变化而自动适应。具体来说,您可以针对每个尺寸类别设置以下功能:

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

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

随着视图的大小等级发生变化(例如,当您旋转 iPhone 或在全屏和拆分视图之间切换 iPad 应用程序时),系统会自动将项目添加到视图层次结构中或从视图层次结构中移除它们。系统还会对视图布局的任何更改进行动画处理。

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

Auto Layout Tutorial in ios 9 Part 1: Getting Started Auto Layout Tutorial in iOS 9 Part 2: Constraints Easier Auto Layout: Coding Constraints in iOS 9

【讨论】:

最佳且有帮助的答案【参考方案2】:

有时需要显示另一个控制器。 注意: .compact 特征是所有 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)
    

【讨论】:

【参考方案3】:

你不需要为这些使用不同的 UIViewControllers。你只需要重写 UIViewController 的一些方法来在设备方向改变时修改 UI。

您可以点击以下链接:tutorial 1tutorial 2

【讨论】:

以上是关于设备旋转时切换视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器之间切换时自动旋转

旋转设备时,动画 uiview 切换回其原始状态

iPhone如何显示不同的视图控制器以响应设备旋转?

显示模态视图控制器时设备旋转

在主从视图和其他视图控制器之间切换?

在视图控制器之间切换时,图像旋转动画会加速吗