UIDevice orientation returns 当设备以横向启动时纵向

UIDevice orientation returns portrait when device launches as landscape

这是一个示例代码,如果设备在首次启动时为 "portrait" 或 "landscape" 以及检测到方向更改时将打印该代码。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        getOrientation()
    }

    func getOrientation() {
        let orientation = UIDevice.current.orientation
        if orientation == .landscapeLeft || orientation == .landscapeRight {
            print("landscape")
        }
        else {
            print("portrait")
        }
    }
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        getOrientation()
    }
}

如果我启动带有 phone 肖像的应用程序,它运行良好。但是,如果我在横向模式下使用 phone 启动应用程序,它首先会检测到纵向。但是,如果您之后旋转设备,它将是正确的。这是错误还是我使用 UIDevice.current.orientation 不正确?

此 属性 的值始终为 returns 0,这是未知的,除非已通过调用 beginGeneratingDeviceOrientationNotifications().

启用方向通知

viewWillTransition 方法仅在您旋转设备时触发。您应该尝试在 viewDidAppear

中调用您的 getOrientation

看,你的代码很完美,就是调用不对。 viewDidLoad 方法不保证界面方向或任何 UI 相关属性的东西它只是说 view 已加载但是如果你想保证获得正确的细节那么你应该在 DispatchQueue.main.async(execute: block) (主队列)下调用它,这将给出适当的 orientation 或者另一种方式是在 viewDidLayoutSubviews 下调用,但这有一个缺点,即根据您的视图和子视图调用多次调整大小。

DispatchQueue.main.async {
    self.getOrientation()
}

参考:

Apple 文档:https://developer.apple.com/documentation/uikit/uiviewcontroller

更新您的测试代码

func getOrientation() {
     let orientation = UIDevice.current.orientation
        if orientation == .landscapeLeft || orientation == .landscapeRight {
            print("landscape")
     }
     else if orientation == .unknown{
            print("unknown")
     }else if orientation == .portrait || orientation == .portraitUpsideDown{
            print("portrait")
     }
}