iOS 13中的自动旋转错误

时间:2019-09-16 06:54:10

标签: ios swift uiviewcontroller autolayout autorotate

iOS 13 / 13.1自动旋转的行为似乎与iOS 12不同。例如,我的应用允许用户在设置中将界面方向锁定为纵向或横向模式。

  1. 如果我在设备上具有纵向旋转锁定,并在supportedInterfaceOrientations中返回.landscape,则该界面将保持纵向模式,直到我在设备上禁用纵向锁定方向为止。在iOS 12中似乎并非如此。事实上,在iOS 13中甚至没有调用supportedInterfaceOrientations!

  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()替代方案,它会在所有情况下触发自动旋转。

3 个答案:

答案 0 :(得分:1)

在iOS 12.4.1中,应将“视图控制器”设置为“全屏”以遵守自动旋转方向。

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)

答案 1 :(得分:0)

尝试一下,看看这是否是您要找的东西:

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
        }
    }}

答案 2 :(得分:0)

这对其他遇到此问题的人来说是有效的。转到项目设置“常规”>“部署信息”,并确保已选中“需要全屏显示”设置。

然后将以下代码粘贴到viewDidLoad块之后:

// Forbid autorotate
override open var shouldAutorotate: Bool {
   return false
}

// Specify the orientation
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscape
}