如何判断指定方向下的horizontalSizeClass是否为regular?
解决方案
这个问题我之前也帮不少开发者处理过——你当前的判断逻辑依赖当前实际方向的traitCollection,自然没法在竖屏时预判横屏的尺寸类。不过UIKit其实提供了直接获取指定方向Trait Collection的API,另外也可以用设备特性做兜底方案,给你两种可行的实现:
方法一:获取指定方向的Trait Collection(推荐)
UIWindow有个traitCollection(for:)方法,能直接返回指定界面方向下的Trait Collection,完全不受当前设备方向的影响。步骤很简单:
- 先拿到当前活跃的窗口(适配iOS13+的多Scene架构)
- 指定你要判断的方向(比如横屏)
- 从返回的Trait Collection中读取
horizontalSizeClass
代码示例:
// 加载大屏Storyboard的方法 func loadLargeScreenStoryboard() { let storyboard = UIStoryboard(name: "LargeDevice", bundle: nil) // 后续处理,比如设置根ViewController等 } // 加载小屏Storyboard的方法 func loadSmallScreenStoryboard() { let storyboard = UIStoryboard(name: "SmallDevice", bundle: nil) // 后续处理 } // 核心判断逻辑 func determineWhichStoryboardToLoad() { // 获取当前活跃的Key Window(适配iOS13+多Scene) guard let activeWindow = UIApplication.shared.connectedScenes .filter({ $0.activationState == .foregroundActive }) .compactMap({ $0 as? UIWindowScene }) .first?.windows .first(where: { $0.isKeyWindow }) else { // 兜底:如果拿不到窗口,默认加载小屏Storyboard loadSmallScreenStoryboard() return } // 指定要判断的方向:横屏(左右横屏的尺寸类一致,选一个即可) let targetOrientation: UIInterfaceOrientation = .landscapeLeft if let targetTrait = activeWindow.traitCollection(for: targetOrientation), targetTrait.horizontalSizeClass == .regular { // 横屏时horizontalSizeClass为regular,加载大屏Storyboard loadLargeScreenStoryboard() } else { // 小屏设备横屏时为compact,加载小屏Storyboard loadSmallScreenStoryboard() } }
这个方法的优势是完全遵循UIKit的自适应设计理念,不管未来出什么新设备,只要系统定义的横屏尺寸类符合regular,代码无需修改。
方法二:直接判断设备类型(兜底方案)
如果你想更直接地控制,也可以通过设备类型或屏幕尺寸来判断——毕竟iPad和iPhone Plus/Max机型横屏时的horizontalSizeClass必然是regular,小屏iPhone则是compact。
代码示例:
func isLargeDeviceThatSupportsRegularHorizontalClassInLandscape() -> Bool { // 第一步:判断是否是iPad if UIDevice.current.userInterfaceIdiom == .pad { return true } // 第二步:判断是否是iPhone Plus/Max机型(屏幕宽度>=414pt,竖屏状态下的宽度) let screenBounds = UIScreen.main.bounds let maxDimension = max(screenBounds.width, screenBounds.height) return maxDimension >= 414 } // 使用时 if isLargeDeviceThatSupportsRegularHorizontalClassInLandscape() { loadLargeScreenStoryboard() } else { loadSmallScreenStoryboard() }
这种方法的好处是逻辑直观,但缺点是需要维护设备尺寸列表——如果未来苹果推出新的小屏机型但横屏尺寸类是regular(可能性极低),或者新的大屏机型尺寸超出414pt,你需要更新判断条件。
内容的提问来源于stack exchange,提问作者TruMan1
相关产品推荐
相关产品推荐

