Device️设备方向!=接口方向⚠️
Swift 5. * iOS13及以下
您应该真正在以下方面有所作为:
- 设备方向=>指示物理设备的方向
- 界面方向=>指示屏幕上显示的界面的方向
在许多情况下,这两个值不匹配,例如:
在大多数情况下,您可能希望使用界面方向,并且可以通过窗口获取它:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
如果您还想支持<iOS 13(例如iOS 12),则可以执行以下操作:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
现在,您需要定义对窗口界面方向变化做出反应的位置。有多种方法可以做到这一点,但最佳解决方案是在内完成
willTransition(to newCollection: UITraitCollection
。
每次更改界面方向时,都会触发此继承的UIViewController方法。因此,您可以在后者中进行所有修改。
这是一个解决方案示例:
class ViewController: UIViewController {
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
coordinator.animate(alongsideTransition: { (context) in
guard let windowInterfaceOrientation = self.windowInterfaceOrientation else { return }
if windowInterfaceOrientation.isLandscape {
// activate landscape changes
} else {
// activate portrait changes
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
通过实现此方法,您将能够对界面方向的任何更改做出反应。但是请记住,它不会在应用程序打开时触发,因此您还必须在中手动更新界面viewWillAppear()
。
我创建了一个示例项目,强调了设备方向和接口方向之间的区别。此外,它将帮助您了解不同的行为,具体取决于您决定更新UI的生命周期步骤。
随时克隆并运行以下存储库:https :
//github.com/wjosset/ReactToOrientation