1. ホーム
  2. swift

[解決済み] Swiftで1つのビューコントローラの向きを縦向きのみに固定する方法

2022-07-23 17:07:40

質問

私のアプリはすべての方向をサポートするようになったので 特定のUIViewControllerにポートレートモードのみをロックしたいのですが。

例:タブ型アプリケーションで、サインインビューが表示されたとき、ユーザーがデバイスをどのように回転させても、また現在のデバイスの向きがどうであっても、そのサインインビューだけをポートレートモードにしたい。

どのように解決するのですか?

複数のナビゲーションコントローラやタブビューコントローラを持つような複雑なビュー階層を持つ場合、事態は非常に混乱します。

この実装では、App Delegate がサブビューを順次検索する代わりに、個々のビューコントローラが方向性をロックするタイミングを設定するようになっています。

Swift 3, 4, 5

AppDelegateで。

/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return self.orientationLock
}

他のグローバルな構造体やヘルパークラスで、ここではAppUtilityを作成しました。

struct AppUtility {

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
    
        if let delegate = UIApplication.shared.delegate as? AppDelegate {
            delegate.orientationLock = orientation
        }
    }

    /// OPTIONAL Added method to adjust lock and rotate to the desired orientation
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
   
        self.lockOrientation(orientation)
    
        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
        UINavigationController.attemptRotationToDeviceOrientation()
    }

}

次に、目的のViewControllerで、向きを固定したい。

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    AppUtility.lockOrientation(.portrait)
    // Or to rotate and lock
    // AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
    
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    // Don't forget to reset when view is being removed
    AppUtility.lockOrientation(.all)
}

iPadまたはユニバーサルアプリの場合

ターゲット設定 -> General -> Deployment Info で "Requires full screen" にチェックが入っていることを確認します。 supportedInterfaceOrientationsFor にチェックが入っていないと、デリゲートが呼び出されません。