iOS 16 Beta中interfaceOrientation界面方向检测返回值错误问题
问题诱因
- 从iOS 16版本开始,苹果正式将
UIWindowScene.interfaceOrientation标记为废弃API,Beta1、Beta2阶段该属性的内部实现未完成兼容迁移,存在枚举值映射Bug:横屏状态下内部状态位未做正确转换,会错误返回portraitUpsideDown枚举值。 - 原有代码中通过
UIApplication.shared.windows.first取窗口的写法本身就存在兼容性隐患:iOS 13引入多Scene机制后,windows数组会包含所有已连接Scene下的窗口对象,数组顺序不保证前台活跃窗口排在第一位,多窗口场景下本身就可能取到非当前界面的窗口对象,进一步加剧方向取值错误的概率。
适配修复方案
- 优先使用当前顶层可见视图控制器的
interfaceOrientation属性获取方向,该属性在iOS 14到iOS 16全版本均会返回当前控制器对应界面的正确方向,兼容写法参考:
// 扩展方法:获取当前最上层可见控制器 extension UIViewController { func topMostViewController() -> UIViewController { if let presented = presentedViewController { return presented.topMostViewController() } if let nav = self as? UINavigationController { return nav.visibleViewController?.topMostViewController() ?? nav } if let tab = self as? UITabBarController { return tab.selectedViewController?.topMostViewController() ?? tab } return self } } // 正确获取当前界面方向 func getCurrentInterfaceOrientation() -> UIInterfaceOrientation? { let activeScene = UIApplication.shared.connectedScenes .filter { $0.activationState == .foregroundActive } .compactMap { $0 as? UIWindowScene } .first let keyWindow = activeScene?.windows.first(where: { $0.isKeyWindow }) guard let topVC = keyWindow?.rootViewController?.topMostViewController() else { return nil } return topVC.interfaceOrientation }
- 如果需要全局监听界面方向变化,iOS 16及以上版本不要继续监听旧的方向变更通知,改用
UIWindowScene的几何状态发布者获取实时方向:
import Combine // 绑定方向监听逻辑 if #available(iOS 16.0, *) { windowScene?.publish(effectiveGeometry: .init()) .sink(receiveValue: { [weak self] geometry in let currentOrientation = geometry.interfaceOrientation // 执行方向变更后的UI调整逻辑 }) .store(in: &cancellableSet) } else { // iOS16以下版本可继续沿用UIApplication.didChangeStatusBarOrientationNotification通知监听 }
- 临时兜底方案:如果暂时无法大规模重构原有逻辑,可通过
UIDevice.current.orientation做交叉校验,过滤掉faceUp/faceDown这类平面状态后,当发现UIWindowScene.interfaceOrientation返回值和设备方向的横竖屏属性不匹配时,用设备方向的结果做临时修正,注意该方案仅做临时兼容,正式版本还是建议切换到上述两种官方推荐的取值方式。
注意:
UIDevice.current.orientation返回的是设备物理方向,和用户锁定竖屏、APP支持的方向限制可能存在差异,不能作为唯一判断依据。
内容的提问来源于stack exchange,提问作者Gizmodo
相关产品推荐
相关产品推荐

