⚠️デバイスの向き!=インターフェースの向き⚠️
Swift 5. * iOS13以下
あなたは本当に違いを生むべきです:
- デバイスの向き=>物理デバイスの向きを示します
- インターフェースの向き=>画面に表示されるインターフェースの向きを示します
これらの2つの値が一致しない多くのシナリオがあります。
ほとんどの場合、インターフェースの向きを使用する必要があり、ウィンドウから取得できます。
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