SwiftUI — padding

在 SwiftUI 中,padding 是一个非常常用的修饰符,用于为视图添加内边距(内边距是指内容与视图边界之间的空间)。可以通过 padding 调整视图的布局,让界面更加整洁且符合设计需求。我们来详细了解它的用法、参数以及使用场景。


1. 基本用法 #

最简单的 padding 使用方式是不带参数,直接为视图添加默认边距。

示例: #

struct BasicPaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding() // 应用默认的系统边距
            .border(Color.blue, width: 2) // 辅助描边查看效果
    }
}

效果: #

  • 默认边距大小: 系统会自动选择合适的边距,例如在许多情况下会使用 16 点的内边距。
  • 文本的四周(上、下、左、右)均增加默认的边距,内容不会紧贴边界。

2. 设置边距大小 #

如果不想使用系统的默认边距,可以通过参数指定具体的边距大小。

示例: #

struct CustomPaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding(30) // 设置 30 点的统一边距
            .border(Color.blue, width: 2)
    }
}

效果: #

所有方向的内边距均为 30 点。数值可以根据需要调整。


3. 针对特定方向设置边距 #

可以通过显式地设置某些方向上的边距,而不是对所有方向应用统一大小。方向包括:

  • .top:上
  • .bottom:下
  • .leading:左
  • .trailing:右

或者利用 .horizontal(包括左右)以及 .vertical(包括上下)。

示例:指定方向的边距 #

struct DirectionalPaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding(.leading, 20) // 左侧边距 20 点
            .padding(.top, 10) // 上侧边距 10 点
            .padding(.trailing, 5) // 右侧边距 5 点
            .border(Color.blue, width: 2)
    }
}

示例:横向和纵向边距 #

struct HorizontalAndVerticalPaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding(.horizontal, 15) // 左右边距 15 点
            .padding(.vertical, 10) // 上下边距 10 点
            .border(Color.blue, width: 2)
    }
}

4. 嵌套和多个 padding 的效果 #

在 SwiftUI 中,可以对同一个视图多次使用 padding,这些 padding 会累加或覆盖。

示例: #

struct NestedPaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding(10) // 外层增加 10 点边距
            .padding(.horizontal, 20) // 进一步增加左右的 20 点边距
            .border(Color.blue, width: 2)
    }
}

效果: #

  • 内部逻辑: 上下方向只有 10 点边距,而左右方向则是 10 + 20 = 30 点的累计边距。

5. 结合其他布局视图使用 #

示例:与 VStackZStack 结合 #

当应用在容器视图时,padding 会使其所有子视图整体移动、缩小或保持距离。

struct StackPaddingExample: View {
    var body: some View {
        VStack {
            Text("Item 1")
                .border(Color.red)
            Text("Item 2")
                .border(Color.red)
        }
        .padding(20) // 整个 VStack 添加边距
        .border(Color.blue, width: 2)
    }
}

6. padding 在不同设备和布局上下文中的行为 #

SwiftUI 的 padding 是响应式的,会根据视图所处的环境和设备进行适配。

6.1 在小屏幕设备上 #

如果设备屏幕较小(例如 iPhone SE),系统会合理分配默认的内边距,确保内容不会超出安全区域。

struct ResponsivePaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding() // 系统的默认适配
            .border(Color.blue)
    }
}

6.2 自定义适配(忽略安全区域) #

如果想忽略系统默认边距并完全自定义,可以组合 edgesIgnoringSafeAreapadding

struct IgnoringSafeAreaPaddingExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding(40) // 添加自定义内边距
            .background(Color.yellow)
            .edgesIgnoringSafeArea(.all) // 无视安全区域
    }
}

7. 实际场景中的使用 #

7.1 文本与按钮的间距 #

struct TextButtonSpacingExample: View {
    var body: some View {
        VStack {
            Text("Welcome to SwiftUI")
                .font(.title)
                .padding(.bottom, 20) // 文本与按钮之间的间距

            Button(action: {}) {
                Text("Press me")
            }
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
        }
    }
}

7.2 图片与文本的复合布局 #

struct ImageTextExample: View {
    var body: some View {
        VStack {
            Image(systemName: "star.fill")
                .foregroundColor(.yellow)
                .font(.largeTitle)
                .padding(.bottom, 10) // 图片与文字的间距

            Text("Star Icon")
                .font(.headline)
        }
        .padding()
        .background(Color.gray.opacity(0.2)) // 为整个布局添加背景
        .cornerRadius(10)
    }
}

8. 结合其他修饰符调整效果 #

padding 常常与其他修饰符配合使用,来达到更好的视觉效果,比如 framecornerRadiusborder

示例: #

struct CombinedModifiersExample: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .padding(20) // 添加内边距
            .frame(maxWidth: .infinity) // 横向撑满屏幕
            .background(Color.green) // 背景颜色
            .cornerRadius(10) // 圆角
            .shadow(radius: 5) // 阴影
    }
}

9. 总结 #

  • padding 的作用: 为内容与容器边界之间添加内边距,提供空间感,避免内容过于紧凑。
  • 基础用法:
    • 不带参数时使用默认边距。
    • 指定某些方向的边距(如 .leading.horizontal)。
    • 指定具体大小来精细控制某个方向或所有方向的边距。
  • 动态布局:
    • padding 会根据界面的上下文和布局环境自动调整。
    • 与容器(如 VStackHStackZStack)和其他修饰符配合使用,可以实现灵活的设计。
本文共 1408 字,上次修改于 Jan 4, 2025