iOS模拟器初始加载时UIDevice方向识别错误问题咨询
解决初始加载时设备方向识别错误的问题
这个问题我之前开发时也踩过坑!核心原因是ViewController初始加载阶段,UIDevice.current.orientation还没完成系统层面的初始化,会返回.unknown,刚好你的else分支把unknown归到了Landscape里,所以才会出现明明是Portrait却打印Landscape的情况。而当你旋转屏幕时,系统会触发方向更新的通知,这时候设备方向的状态就被正确设置了,所以后续判断都正常。
给你两个靠谱的解决方案,按需选择:
方案一:通过界面方向(Interface Orientation)判断
这种方法更贴合系统的方向状态,适合需要和系统方向同步的场景。注意iOS 13之后UIApplication.shared.statusBarOrientation被弃用,要改用windowScene的接口:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 获取当前界面的方向 var currentOrientation: UIInterfaceOrientation if #available(iOS 13.0, *) { // iOS13及以上,从windowScene获取 currentOrientation = view.window?.windowScene?.interfaceOrientation ?? .portrait } else { // iOS13以下,用statusBarOrientation currentOrientation = UIApplication.shared.statusBarOrientation } // 判断横竖屏 if currentOrientation.isPortrait { print("Portrait") } else { print("Landscape") } }
方案二:直接通过视图尺寸判断
如果你只关心当前布局的实际横竖状态,不依赖系统的方向标记,这种方法最可靠,完全不受系统初始化延迟的影响:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 直接比较视图的宽高:宽<高就是竖屏,反之横屏 if view.bounds.width < view.bounds.height { print("Portrait") } else { print("Landscape") } }
简单总结下:方案一适合需要和系统方向严格对齐的场景,方案二更简单直接,适合只关心布局方向的情况。两种方法都能解决你初始加载时方向判断错误的问题~
内容的提问来源于stack exchange,提问作者Coder221
相关产品推荐
相关产品推荐

