首页 > 解决方案 > 当您有多个视图控制器时如何检测到横向的转换

问题描述

我有一个只有 4 个视图控制器的小应用程序,我想在用户切换到横向时更改布局。我想出了如何检查景观,但该功能存在于一个 viewController 类中,我不清楚如何让我的其他 viewController 在 vi​​ewWillTransition 触发时采取行动。我是否在每个视图控制器类中放置了该覆盖函数的一个版本来执行特定于它的事情?当我尝试在 segue 之后将覆盖放在两个类中时,它们都被解雇了,并且感觉不是“正确的做法”,所以我想问专家。

在应用程序启动时使用下面的代码,我设置了一个全局布尔值,以确定它是否处于横向状态,并使用 viewWillTransition 来检测更改。

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    print("Will Transition to size \(size) from super view size \(self.view.frame.size)")

    if (size.width > self.view.frame.size.width) {
        print("Landscape")
        inLandscapeMode = true
    } else {
        print("Portrait")
        inLandscapeMode = false
    }

    if (size.width != self.view.frame.size.width) {
        DispatchQueue.main.async {
            // DO SOMETHING LIKE reload a Table/Collection view to ensure no dequeued cells have old constraints... self.tableView.reloadData()
        }
    }
}
func setUpFormatting(){
    let size = UIScreen.main.bounds.size
    print("On App Start size \(size)")
    if size.width > size.height {
        print("Landscape")
        inLandscapeMode = true
    } else {
        print("Portrait")
        inLandscapeMode = false
    }
}

所有的

标签: swiftautolayoutlandscape-portraitviewwilltransitiontosize

解决方案


您可以在每个视图控制器中获取设备方向并通过该值设置视图

if UIDevice.current.orientation == .portrait {

} else if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight {

}

推荐阅读