当设备以横向启动时,UIDevice 方向返回纵向

Posted

技术标签:

【中文标题】当设备以横向启动时,UIDevice 方向返回纵向【英文标题】:UIDevice orientation returns portrait when device launches as landscape 【发布时间】:2018-11-05 07:15:45 【问题描述】:

这是一个示例代码,当设备首次启动时以及检测到方向变化时,将打印设备是“纵向”还是“横向”。

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()
    

如果我使用手机头像启动应用程序,它就可以正常工作。但是,如果我在手机横向启动应用程序时,它首先会检测到纵向。但是,如果您之后旋转设备,它将是正确的。这是一个错误还是我错误地使用了UIDevice.current.orientation

【问题讨论】:

【参考方案1】:

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

DispatchQueue.main.async 
    self.getOrientation()

参考:view.frame.width IS correct in viewDidLoad with storyboard, why?

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

【讨论】:

【参考方案2】:

此属性的值始终返回未知的 0,除非已通过调用 beginGeneratingDeviceOrientationNotifications() 启用方向通知。

【讨论】:

【参考方案3】:

viewWillTransition 方法仅在您旋转设备时触发。您应该尝试在viewDidAppear 中致电您的getOrientation

【讨论】:

【参考方案4】:

更新您的测试代码

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")
     

【讨论】:

代码没问题!无需更改!

以上是关于当设备以横向启动时,UIDevice 方向返回纵向的主要内容,如果未能解决你的问题,请参考以下文章

当视图从纵向更改为横向时,方向不会改变

仅以纵向启动应用程序

IOS 启动屏幕故事板以不同的方向显示

iPad 纵向应用程序以横向模式加载 iAd

当 iphone 设备方向朝上/朝下时,我可以判断它是横向还是纵向?

从 UINavigationController 弹出视图会改变设备方向