目次
前提条件
以下の環境で実行しています。
- Xcode 12.0
- iPhoneシミュレータ: iOS14系
ちなみにiPad は本ポストの方法を使っても、自動回転は無効化できません。
(iPad はどのような向きでも使えるようにするのが望ましいというアップルの方針があったと思います。)
まずアプリ全体の設定をする
TARGETS > General > Deployment Info > Device Orientation
で以下のようなチェックがついていることを確認します。
特定のViewController についてではなく、アプリ全体として対応する場合がある全ての向きにチェックを入れます。
デフォルトでこのようになっていると思います。

ViewController に回転制御のロジックを追加
回転させたくないViewController について
以下のように書きます。
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
それぞれのメソッドは読んで字の如くですが、
shouldAutorotate
: 画面を自動回転させるか否かsupportedInterfaceOrientations
: ViewController が対応している画面の方向。この場合は縦方向のみに制限しています。
回転させたいViewController について
以下のように書きます。
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .allButUpsideDown
}
.allButUpsideDown
は縦(順方向)、横に対応という意味です。
縦(逆方向)のみ対応しないことになります。
UINavigationController にも回転制御のロジックを追加
ViewController のみであれば上記の設定で完了ですが、
そのViewController たちをUINavigationController 配下として表示している場合、ロジックは働きません。
UINavigationController にもロジックを追加してやる必要があります。
open override var shouldAutorotate: Bool {
guard let viewController = self.visibleViewController else {
return false
}
return viewController.shouldAutorotate
}
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
guard let viewController = self.visibleViewController else {
return .allButUpsideDown
}
return viewController.supportedInterfaceOrientations
}
UINavigationController にも shouldAutorotate
、supportedInterfaceOrientations
のロジックを追加してやるのですが、
その返り値は、表示しているViewController の設定に従う、というものになります。
これで狙い通りの挙動になると思います!
最後に
以上です。お疲れ様でした!
「[iOS] iPhoneでUINavigationController 配下の特定のViewController だけ画面の自動回転を許可する」への1件のフィードバック