web-dev-qa-db-ja.com

shouldAutorotateをオーバーライドすると、Swift 3

1つのUIViewControllerの回転を防止しようとしていますが、それを達成できません。

私はこのようなことをしています:

open override var shouldAutorotate: Bool {
    get {
        return false
    }
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get {
        return .portrait
    }
}

そして、UIViewControlerはまだ回転しています。 UIViewControllerは、モーダルで開かれたUINavigationController内にあります。

私はここから多くの質問を見てきましたが、答えはありません。

In Swift 2 shouldAutorotateをオーバーライドするために使用していましたが、in Swift 3ではその関数はもう存在しません。

Swift 3でSwift 2?

28
pableiros

この振る舞いを何度も再現できるのであれば、なぜ質問を終了する投票になるのか分かりません。 UIViewControllerは、モーダルで開かれたUINavigationControllerの中にあります。

これは私が問題を解決するためにしたことです。

このクラスを作成し、回転させないようにするUINavigationControllerを含むUIViewControllerに設定します

class NavigationController: UINavigationController { 

    override var shouldAutorotate: Bool {
        return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }

}

そしてそれはそれ、私のために働く

42
pableiros

このコードをAppDelegate.Swiftに追加します

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

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

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
        self.lockOrientation(orientation)
        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
    }
}

方向を強制するviewcontrollerに追加します。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    //let value = UIInterfaceOrientation.landscapeLeft.rawValue
    //UIDevice.current.setValue(value, forKey: "orientation")


    AppDelegate.AppUtility.lockOrientation(.landscapeLeft)

}

私にとって、投票された答えはうまくいきませんでした。代わりに、

override open var shouldAutorotate: Bool {
    return false
}

override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return UIApplication.shared.statusBarOrientation
}

これらのコードは機能します。 Swift 4。

4
14c

UIApplicationDelegateクラスに次のAppDelegateメソッドを実装していない限り、iOS 11はこれらのメソッドをまったく呼び出していませんでした。

application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)
3