2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftUIにて画面の向きを固定、また画面回転の許可をコードにて制御する方法

Last updated at Posted at 2022-09-29

画面を固定するのか、回転させるのか?

  • 回転する画面に対応するのか?
  • それとも画面は固定にするのか?

Xcodeの設定で画面を固定したりする記事はよく見かけるのですが、画面ごとに設定を変更したい時はコードで設定する必要がありましたので、コードで制御しました。

ちなみに、どういう仕様だったかというと、普段の画面は縦型固定にして、Web表示する時だけ回転可能にしました。

UIKitだと記事が多いのですが、SwiftUIだと少ない気がしたので自分の備忘録的に書きました。

開発環境

  • Xcode:Version14.0
  • Swift:Swift5
  • 対応OS:iOS15.6

まずAppDelegateにapplicationデリゲートを用意する

この時回転を許可するかどうかも最初に決めておきます。

sampleApp.swift

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について調べてみる

画面設定更新と表示更新方法

orientationLockUIInterfaceOrientationMaskのデータを渡すことでアプリ画面の設定します。
上記処理を、画面設定更新したいViewのonAppear()などで設定すれば反映されます。

onAppear
    .onAppear()
        // 縦画面固定
        AppDelegate.orientationLock = UIInterfaceOrientationMask.partrait
    }

orientationLockにUIInterfaceOrientationMaskのデータを渡すだけでは現状の画面が維持されてしまいます。
例えば、横画面の状態で画面遷移後の次の画面は縦画面にしたい時、上記だけでは遷移後横画面で開いてしまいます。
従って、更新処理が必要になります。


    .onDisappear()
        // 縦画面固定
        AppDelegate.orientationLock = UIInterfaceOrientationMask.partrait
        // 以下更新処理
        UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
        UINavigationController.attemptRotationToDeviceOrientation()
    }

更新処理を実施することで、遷移後に無事、縦画面で表示することができます。
私は回転許可している画面が閉じられる時に、設定したためonDisappearに処理を書きました。

終わりに

モバイルアプリになると、画面の回転に対応するのか、それとも対応しないのかって結構大事なことなのかな?と思います。
私もアプリ開発に触れるまでは、そこまで難しいと思っていませんでした:sweat:

回転することに対応したアプリを開発している人には心から賞賛したい気持ちです!!

お読みいただきありがとうございました!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?