[iOS] iPhoneでUINavigationController 配下の特定のViewController だけ画面の自動回転を許可する

前提条件

以下の環境で実行しています。

  • 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 にも shouldAutorotatesupportedInterfaceOrientations のロジックを追加してやるのですが、
その返り値は、表示しているViewController の設定に従う、というものになります。

これで狙い通りの挙動になると思います!

最後に

以上です。お疲れ様でした!

[iOS] iPhoneでUINavigationController 配下の特定のViewController だけ画面の自動回転を許可する」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。