web-dev-qa-db-ja.com

iOS 13の自動回転のバグ

iOS 13/13.1自動回転は、iOS 12とは異なる動作をするようです。たとえば、私のアプリでは、設定でインターフェイスの向きを縦向きまたは横向きにロックできます。

  1. デバイスに縦向きの回転ロックがあり、supportedInterfaceOrientationsで.landscapeを返す場合、デバイスで縦向きのロック方向を無効にするまで、インターフェイスは縦向きモードのままです。これは、iOS 12では当てはまらないようです。事実、supportedInterfaceOrientationsはiOS 13でも呼び出されません。

  2. UIViewController.attemptRotationToDeviceOrientation()もこのような場合には機能しません。

問題の根本は、アプリの初期化中に一時的にshouldAutorotateをfalseに返し、すべてが初期化されたら、UIViewController.attemptRotationToDeviceOrientation()を呼び出して自動回転をトリガーします。 iOS 12では自動回転をトリガーしますが、iOS 13.1では機能しません。

おそらくiOS 13.1のバグのようです。自動ローテーションをトリガーするにはどうすればよいですか?

編集:iOS 12.4.1もUIViewController.attemptRotationToDeviceOrientation()を無視するようです。 iOS 12.4.1以降では、自動回転に問題があります。

明確にするために、これは私が欲しいものです:

a。 iPhoneで縦向きのロックが設定されている場合でも、必要に応じてインターフェイスを横向きモードに自動回転させます。

b。すべての状況で自動回転をトリガーするUIViewController.attemptRotationToDeviceOrientation()代替。

15
Deepak Sharma

これを試して、これがあなたが探しているものかどうかを確認してください:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

    }

    @IBAction func btnLandscapeClicked(_ sender: Any) {
        let value = UIInterfaceOrientation.landscapeLeft.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")
    }

    @IBAction func btnPortraitClicked(_ sender: Any) {
        let value = UIInterfaceOrientation.portrait.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")
    }

}

extension UINavigationController {

    override open var shouldAutorotate: Bool {
        get {
            if let visibleVC = visibleViewController {
                return visibleVC.shouldAutorotate
            }
            return super.shouldAutorotate
        }
    }

    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
        get {
            if let visibleVC = visibleViewController {
                return visibleVC.preferredInterfaceOrientationForPresentation
            }
            return super.preferredInterfaceOrientationForPresentation
        }
    }

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
        get {
            if let visibleVC = visibleViewController {
                return visibleVC.supportedInterfaceOrientations
            }
            return super.supportedInterfaceOrientations
        }
    }}
0
Amir.n3t