iPhone X中preferredInterfaceOrientationForPresentation失效,横屏VC显示求助
解决iPhone X上模态视图控制器横屏失效的问题
我之前也踩过一模一样的坑!iPhone X这类全面屏设备的界面方向适配确实有特殊的约束,核心是系统对模态视图的展示样式和方向控制逻辑更严格。下面是亲测有效的解决方案:
步骤1:全局方向兜底控制(AppDelegate中)
先确保全局默认保持竖屏,但允许目标横屏VC突破这个限制:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { // 获取当前最上层的弹出视图控制器 guard let topVC = window?.rootViewController?.presentedViewController else { // 无弹出VC时,全局保持竖屏 return .portrait } // 判断是否是需要横屏的目标VC if topVC is YourLandscapeViewController { // 允许它使用指定的横屏方向 return .landscapeLeft } // 其他弹出VC保持竖屏 return .portrait }
步骤2:横屏VC的方向配置优化
在你的目标横屏VC里,补充shouldAutorotate属性,并明确指定支持的方向(别用all,避免不必要的兼容问题):
override var shouldAutorotate: Bool { return true } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return .landscapeLeft } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .landscapeLeft }
步骤3:调整模态弹出样式(关键!)
iPhone X上默认的模态样式(比如pageSheet)会被系统强制限制为竖屏,所以弹出这个VC时必须设置全屏展示:
// 创建横屏VC实例 let landscapeVC = YourLandscapeViewController() // 设置全屏模态样式,让VC能完全掌控方向 landscapeVC.modalPresentationStyle = .fullScreen // 弹出视图控制器 present(landscapeVC, animated: true)
为什么iPhone X会出现这个问题?
iPhone X及之后的全面屏设备,系统默认的模态展示样式是pageSheet,这种样式下系统会优先保持竖屏布局逻辑,即使你在VC里重写了方向相关属性也会被忽略。改成fullScreen后,VC才能完全掌控自己的界面方向。
按上面的步骤配置后,全局依然保持竖屏,只有这个特定VC弹出时会强制切换到横屏,返回后自动恢复竖屏,所有设备(包括iPhone X)都能正常工作啦!
内容的提问来源于stack exchange,提问作者crysis
相关产品推荐
相关产品推荐

