SwiftUI可用空间分类Size Class
SwiftUI可用空间分类Size Class

SwiftUI可用空间分类Size Class

Size Class 是 SwiftUI 提供的一个工具,用于根据设备的可用空间调整布局。它将设备的可用空间分为两种简单的分类:

1、Compact(紧凑)

2、Regular(常规)

这些分类既适用于水平空间(horizontalSizeClass),也适用于垂直空间(verticalSizeClass),从而帮助我们为不同设备、方向和屏幕大小提供适配的布局。

Size Class 的主要特点

1、水平与垂直分类

horizontalSizeClass:表示屏幕的水平空间分类。

verticalSizeClass:表示屏幕的垂直空间分类。

2、跨设备适配

在较小的设备上(如 iPhone),通常水平和垂直空间是 compact。

在较大的设备上(如 iPad),通常垂直空间为 regular,而水平空间可能是 compact 或 regular。

3、动态响应

当设备从竖屏旋转到横屏时,Size Class 可能会发生变化。

在多窗口和分屏模式下,Size Class 也会动态调整。

如何在 SwiftUI 中使用 Size Class

可以通过环境变量 @Environment 访问当前的 Size Class:

@Environment(\.horizontalSizeClass) var horizontalSizeClass
@Environment(\.verticalSizeClass) var verticalSizeClass

示例代码

根据 Size Class 切换布局

以下代码展示了如何在 horizontalSizeClass 为 compact 时使用垂直布局,而在其他情况下使用水平布局:

struct ContentView: View {
    @Environment(\.horizontalSizeClass) var horizontalSizeClass

    var body: some View {
        if horizontalSizeClass == .compact {
            VStack {
                Text("Name: John")
                Text("Age: 25")
            }
        } else {
            HStack {
                Text("Name: John")
                Text("Age: 25")
            }
        }
    }
}

iPhone Portrait (竖屏): horizontalSizeClass == .compact,视图将垂直排列。

iPad Landscape (横屏): horizontalSizeClass == .regular,视图将水平排列。

结合条件和自定义内容

可以根据水平和垂直 Size Class 动态改变布局内容:

struct AdaptiveView: View {
    @Environment(\.horizontalSizeClass) var horizontalSizeClass
    @Environment(\.verticalSizeClass) var verticalSizeClass

    var body: some View {
        Group {
            if horizontalSizeClass == .compact && verticalSizeClass == .regular {
                Text("This is an iPhone in Portrait Mode")
            } else if horizontalSizeClass == .regular && verticalSizeClass == .regular {
                Text("This is an iPad in any Mode")
            } else {
                Text("Other Device or Orientation")
            }
        }
        .padding()
    }
}

截图为iPhone 15 pro max横屏

Size Class 分类总结

所有纵向 iPhone 都具有紧凑的宽度和常规的高度。

大多数横向显示的 iPhone 都有紧凑的宽度和紧凑的高度。

大型 iPhone(Plus 尺寸和 Max 设备)在横向显示时具有常规宽度和紧凑高度。

当应用程序以全屏方式运行时,两种方向的所有 iPad 都具有常规宽度和常规高度。

使用 Size Class 的场景

1、自适应布局:根据设备方向和大小切换布局,例如从 VStack 到 HStack。

2、优化用户体验:在小屏设备上隐藏次要内容,在大屏设备上显示完整内容。

3、支持分屏模式:特别是在 iPad 上,分屏模式可能影响布局。

4、动态调整内容:通过检测 Size Class,动态改变显示的文字或图片。

ViewThatFits 替代方案

如果需要更灵活地根据设备大小调整布局,可以使用 ViewThatFits。它会尝试不同的布局,直到找到适合当前设备空间的内容:

ViewThatFits {
    HStack {
        Text("This is a horizontal layout")
    }

    VStack {
        Text("This is a vertical layout")
    }
}

ViewThatFits 是 Size Class 的补充工具,可以在布局调整中简化代码逻辑。

总结

Size Class 是一个简单而强大的工具,帮助开发者根据屏幕大小和方向提供响应式布局。

通过 @Environment 可以轻松访问当前的 horizontalSizeClass 和 verticalSizeClass。

配合 ViewThatFits 和其他布局工具,可以实现复杂的跨设备适配逻辑。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注