[iOS] iPhone でアプリを強制的に画面回転をさせる

前提条件

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

  • Xcode 12.0
  • iPhoneシミュレータ: iOS14系

ちなみにiPad については、iOSのバージョンによっては本ポストの方法を使っても画面回転しません。
iPad はどのような向きでも使えるようにするのが望ましいというアップルの方針があったと思います。
(iPhoneもですが、特にiPad は)方向という考え方ではなく、
画面サイズの変更を扱っていると捉えましょう、ということだと思います。

強制的に画面回転をさせる

例えばiPhone 自体は縦向きのままで、プログラムによってアプリを強制的に横向き表示にしたい場合。

UIDevice.current.setValue(
    UIInterfaceOrientation.landscapeRight.rawValue,
    forKey: "orientation"
) 


上記の処理を走らせると、以下画像のようになります。
landscapeRight と指定しているので、アプリのコンテンツのみが90度右回り(時計回り)します。

注意点として、ViewController の回転制御に関するプロパティも以下のように設定しておく必要があります。
本ブログの [iOS] iPhoneでUINavigationController 配下の特定のViewController だけ画面の自動回転を許可する
の記事も参考になるかもしれません。

 override var shouldAutorotate: Bool {
    return true
}
     
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .allButUpsideDown 
} 
  • shouldAutorotate に false を指定していると、アプリを回転させられません。
  • supportedInterfaceOrientations に例えば .portrait を指定していると、
    ViewController は縦方向にしか対応しないため、結局横向きになりません。

強制的に画面回転する前後の要素の位置について

強制回転、iPhone本体ごと回転どちらの場合でも当てはまりますが、
NSLayoutConstraint で要素の位置を指定すると回転前後でその設定は変わりません。
例えば、要素の位置を、左端から50、上から150を指定した場合。

このようになります。
縦向きのステータスバーの領域が気になりますが、これは正確な位置にするなら調整が必要かもしれません🤔

回転の検知と画面サイズなどの扱いについて

画面回転の検知は、ViewController にtraitCollectionDidChange(_:) というデリゲートメソッドにて可能です。
回転を検知したとき(正確にはアプリのサイズ変更を検知したとき)に呼ばれるデリゲートメソッドとなります。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
         
    print("🐱: isPortrait: \(UIDevice.current.orientation.isPortrait)")
    print("🐱: isLandspace: \(UIDevice.current.orientation.isLandscape)") 
    print("🐱: width: \(UIScreen.main.bounds.size.width)")
    print("🐱: height: \(UIScreen.main.bounds.size.height)")
} 

このデリゲートメソッド内で端末の向き、アプリの横幅、アプリの縦幅を🐱デバッグしてみます。
以下のような結果になります。

けっこう直感的に理解しやすい値になっていると思います。
図の通り、アプリのコンテンツのみ横向きの場合と、端末ごと横向きの場合は同値になります。

最後に

iOSの回転まわりのAPIは以前大幅に変わった歴史もあり、けっこうややこしいイメージでしたが、
書いてみるとそうでもなさそうですね。
よかった🙌

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

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中

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