カスタム動作が必要な場合、新しいサイズ クラス ベースの Autorotation は面倒です。私の要件とフローは次のとおりです。
- ビュー コントローラー 1 (VC1) は、ビュー コントローラー 2 (VC2) をモーダルに表示します。
VC1 は、ユーザー設定 (経由で達成) に応じて、横向き、縦向き、またはその両方のみをサポートします
supportedInterfaceOrientations
。この例では、横向きにロックされていると想定しています。VC 2 は横向きと縦向きの両方をサポート
私は Size クラスを使用し、View Controller 1 ではstatusBarOrientation
、viewWillTransition
(サイズに ...) をチェックして、インターフェイス要素の配置とその他のカスタマイズを構成します。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
let orientation = UIApplication.shared.statusBarOrientation
NSLog("View will transition to \(size), \(orientation.rawValue)")
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { [unowned self] (_) in
....
}
}
これは、VC 2 が提示され、デバイスが回転している場合を除き、機能します。VC 2 が破棄されると、VC 1 はすべて台無しになります。確かに、View Controller 1 が表示されたらレイアウトを更新したいと思います。それ、どうやったら出来るの?UIViewController.attemptRotationToDeviceOrientation() を試しましたが、自動回転メソッドを強制的に再度呼び出すことはありません。
編集: ご覧のとおり、VC1 では statusBarOrientation をチェックして、インターフェイスの向きを決定します。VC2 が縦向きモードに回転すると、statusBarOrientation が縦向きに変更されるため、これは問題を引き起こします。そして、サイズへのviewWillTransitionがVC1で同時に呼び出され、レイアウトを縦向きモードに強制します。