You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断指定方向下的horizontalSizeClass是否为regular?

解决方案

这个问题我之前也帮不少开发者处理过——你当前的判断逻辑依赖当前实际方向的traitCollection,自然没法在竖屏时预判横屏的尺寸类。不过UIKit其实提供了直接获取指定方向Trait Collection的API,另外也可以用设备特性做兜底方案,给你两种可行的实现:

方法一:获取指定方向的Trait Collection(推荐)

UIWindow有个traitCollection(for:)方法,能直接返回指定界面方向下的Trait Collection,完全不受当前设备方向的影响。步骤很简单:

  1. 先拿到当前活跃的窗口(适配iOS13+的多Scene架构)
  2. 指定你要判断的方向(比如横屏)
  3. 从返回的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:41:18