返回

UI 布局的利器:SwiftUI 中 Size Class 全解析

IOS

使用 Size Class 创建不同的布局

    SwiftUI 通过使用 Size Class 来创建不同的布局。要使用它们,您需要在您的视图中使用 `@Environment(\.horizontalSizeClass)` 和 `@Environment(\.verticalSizeClass)` 修饰符。这些修饰符允许您访问设备当前的 Size Class。

    以下是 Size Class 的不同组合:

    * **Compact Width, Regular Height** : 这是 iPhone 和大多数其他智能手机使用的 Size Class。
    * **Regular Width, Regular Height** : 这是 iPad 和大多数平板电脑使用的 Size Class。
    * **Compact Width, Compact Height** : 这是 Apple Watch 和其他可穿戴设备使用的 Size Class。
    * **Regular Width, Compact Height** : 这是 Apple TV 和其他电视设备使用的 Size Class。

    您可以使用这些 Size Class 来创建针对不同设备的自定义布局。例如,您可以为 iPhone 创建一个紧凑的布局,为 iPad 创建一个更宽松的布局。

    以下是如何在 SwiftUI 中使用 Size Class 来创建不同布局的示例:

    ```swift
    struct MyView: View {
        @Environment(\.horizontalSizeClass) var horizontalSizeClass
        @Environment(\.verticalSizeClass) var verticalSizeClass

        var body: some View {
            if horizontalSizeClass == .compact && verticalSizeClass == .regular {
                // This is the layout for iPhone.
                VStack {
                    Text("Hello, world!")
                    Button("Tap me") {
                        // Do something.
                    }
                }
            } else if horizontalSizeClass == .regular && verticalSizeClass == .regular {
                // This is the layout for iPad.
                HStack {
                    Text("Hello, world!")
                    Button("Tap me") {
                        // Do something.
                    }
                }
            } else {
                // This is the layout for other devices.
                Text("Hello, world!")
            }
        }
    }
    ```

    这个例子中,`MyView` 的布局会根据设备的不同而变化。在 iPhone 上,布局将是垂直的,在 iPad 上,布局将是水平的。在其他设备上,布局将只是一个简单的文本视图。

    ## 响应屏幕方向的变化

    Size Class 还可以用于响应屏幕方向的变化。当设备旋转时,Size Class 会自动更新。您可以使用这些更新来更改您的视图的布局。

    以下是如何在 SwiftUI 中使用 Size Class 来响应屏幕方向变化的示例:

    ```swift
    struct MyView: View {
        @Environment(\.horizontalSizeClass) var horizontalSizeClass

        var body: some View {
            if horizontalSizeClass == .compact {
                // This is the layout for portrait orientation.
                VStack {
                    Text("Hello, world!")
                    Button("Tap me") {
                        // Do something.
                    }
                }
            } else {
                // This is the layout for landscape orientation.
                HStack {
                    Text("Hello, world!")
                    Button("Tap me") {
                        // Do something.
                    }
                }
            }
        }
    }
    ```

    这个例子中,`MyView` 的布局会根据屏幕方向的不同而变化。在纵向模式下,布局将是垂直的,在横向模式下,布局将是水平的。

    ## 总结

    Size Class 是 SwiftUI 中一种强大的工具,可用于创建动态布局和响应不同设备和屏幕方向变化。通过使用 Size Class,您可以确保您的应用在所有设备上都看起来很棒。