前提条件
以下の環境で実行しています。
- 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は以前大幅に変わった歴史もあり、けっこうややこしいイメージでしたが、
書いてみるとそうでもなさそうですね。
よかった🙌
以上です。お疲れ様でした!
記事参考になりました
1つ質問よろしいでしょうか
iPad はどのような向きでも使えるようにするのが望ましいというアップルの方針があった
という記述について出典や参照となるガイドライン等はありますか?
開発にあたって重要事項だと感じたのですが探しても見つからず…
よろしくお願いします
いいねいいね
コメントありがとうございます!
そのあたり朧げだったので改めて探してみました。
以下の2つが参考になりそうです。
———————————————-
1.https://developer.apple.com/library/archive/qa/qa1588/_index.html
古いドキュメントですが、以下の記述がありました。
It is strongly recommended that your iPad applications support all orientations.
iPad アプリは全ての方向に対応することを強く推奨します。
2.https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/#general-layout-considerations
こちらは新しいHuman Interface Guidelinesのドキュメントですが、以下の記述がありました。
If possible, support both portrait and landscape orientations. People prefer to use apps in different orientations, so it’s best when you can fulfill that expectation.
可能であれば、縦向きと横向きの両方に対応しましょう。人はアプリを様々な方向で使いたいと思っているので、その期待に応えることができれば最高です。
———————————————-
新しいドキュメントでは特にiPadについて明示されている箇所は見つけることはできませんでした。。!
が、個人的な意見としては、iPhone は横向きもしくは縦向きでそれぞれ使いづらい場面がありそうですが、
iPad は特定の向きが使いづらいというのはあまりなさそうですし、
古いドキュメントではありますが「iPad アプリは全ての方向に対応することを強く推奨します。」という
方針は変わっていないんじゃないかな、と思います。
必須ではないですが、ユーザのことを考えると可能であればそうするのが
アップル的にも開発者的にも望ましいのかなと思いました。
いいねいいね
回答ありがとうございます。とても参考になりました!
必須ではないが、ユーザのことを考えると可能であればそうするのがアップル的にも開発者的にも望ましいと私もそう思います。
改めて回答ありがとうございました。
いいねいいね: 1人
僕も改めて知見を得られました🙌
ありがとうございました!
いいねいいね