当设备以横向启动时,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 方向返回纵向的主要内容,如果未能解决你的问题,请参考以下文章