画面を固定するのか、回転させるのか?
- 回転する画面に対応するのか?
- それとも画面は固定にするのか?
Xcodeの設定で画面を固定したりする記事はよく見かけるのですが、画面ごとに設定を変更したい時はコードで設定する必要がありましたので、コードで制御しました。
ちなみに、どういう仕様だったかというと、普段の画面は縦型固定にして、Web表示する時だけ回転可能にしました。
UIKitだと記事が多いのですが、SwiftUIだと少ない気がしたので自分の備忘録的に書きました。
開発環境
- Xcode:Version14.0
- Swift:Swift5
- 対応OS:iOS15.6
まずAppDelegateにapplicationデリゲートを用意する
この時回転を許可するかどうかも最初に決めておきます。
class AppDelegate: NSObject, UIApplicationDelegate {
// 回転可能か設定する。外部から変更できるよう静的としている
/*
・回転許可:UIInterfaceOrientationMask.all
・縦固定 :UIInterfaceOrientationMask.partrait
・横固定 :UIInterfaceOrientationMask.landscape
・その他 :https://developer.apple.com/documentation/uikit/uiinterfaceorientationmask/
*/
static var orientationLock = UIInterfaceOrientationMask.all
// 設定の変更通知がされた時に呼ばれるデリゲート
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return AppDelegate.orientationLock
}
}
AppDelegateはUIApplicationDelegate等を継承することで、アプリの状態などを管理することができます。
UIDlegate公式ドキュメント
参考記事:AppDelegateについて調べてみる
画面設定更新と表示更新方法
orientationLock
にUIInterfaceOrientationMask
のデータを渡すことでアプリ画面の設定します。
上記処理を、画面設定更新したいViewのonAppear()
などで設定すれば反映されます。
.onAppear()
// 縦画面固定
AppDelegate.orientationLock = UIInterfaceOrientationMask.partrait
}
orientationLockにUIInterfaceOrientationMaskのデータを渡すだけでは現状の画面が維持されてしまいます。
例えば、横画面の状態で画面遷移後の次の画面は縦画面にしたい時、上記だけでは遷移後横画面で開いてしまいます。
従って、更新処理が必要になります。
.onDisappear()
// 縦画面固定
AppDelegate.orientationLock = UIInterfaceOrientationMask.partrait
// 以下更新処理
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
更新処理を実施することで、遷移後に無事、縦画面で表示することができます。
私は回転許可している画面が閉じられる時に、設定したためonDisappear
に処理を書きました。
終わりに
モバイルアプリになると、画面の回転に対応するのか、それとも対応しないのかって結構大事なことなのかな?と思います。
私もアプリ開発に触れるまでは、そこまで難しいと思っていませんでした
回転することに対応したアプリを開発している人には心から賞賛したい気持ちです!!
お読みいただきありがとうございました!