基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

HStack、VStack 和 ZStack 的区别?

知识点图片

在 SwiftUI 中,HStackVStackZStack 是最基础也是最重要的三个布局容器。它们的区别主要在于子视图(Subviews)的排列方向

简单来说:

  • HStack: 水平排列 (Horizontal)
  • VStack: 垂直排列 (Vertical)
  • ZStack: 前后层叠排列 (Z-axis / Depth)

1. VStack (Vertical Stack) - 垂直堆叠

  • 方向:从上到下 (Top to Bottom)。
  • 用途:用于构建列表、表单或任何需要上下排列的元素。
  • 对齐方式:控制子视图在水平方向上的对齐(如左对齐、居中、右对齐)。

代码示例:

plaintext
VStack(alignment: .leading, spacing: 10) {
    Text("标题")
    Text("副标题")
    Button("点击") { }
}
// 结果:三个元素垂直排成一列

2. HStack (Horizontal Stack) - 水平堆叠

  • 方向:从左到右 (Left to Right)。
  • 用途:用于一行内显示多个元素,例如图标加文字、导航栏按钮等。
  • 对齐方式:控制子视图在垂直方向上的对齐(如顶部对齐、居中、底部对齐)。

代码示例:

plaintext
HStack(alignment: .center, spacing: 20) {
    Image(systemName: "star")
    Text("收藏")
}
// 结果:图标在左,文字在右,排成一行

3. ZStack (Z-axis Stack) - 层叠堆叠

  • 方向:从后到前 (Back to Front)。就像 Photoshop 的图层,第一个视图在最底层,最后一个视图在最顶层。
  • 用途:用于背景图片、在图片上覆盖文字、加载指示器覆盖在内容上等。
  • 对齐方式:控制所有图层在容器内的位置(如都在中心、都在右上角)。
  • 注意:ZStack 没有 spacing 参数,因为元素是重叠的。

代码示例:

plaintext
ZStack(alignment: .bottom) {
    Image("backgroundImage") // 底层
    Text("图片说明")          // 顶层,覆盖在图片上
        .foregroundStyle(.white)
}
// 结果:文字浮在图片上方

总结对比表

特性 VStack HStack ZStack
全称 Vertical Stack Horizontal Stack Z-axis Stack
排列方向 垂直 (Y轴) 水平 (X轴) 层叠 (Z轴/深度)
顺序 从上往下 从左往右 从后往前 (覆盖)
主要对齐轴 水平对齐 (Horizontal) 垂直对齐 (Vertical) 双向对齐 (Both)
Spacing 参数 有 (控制行间距) 有 (控制列间距) (元素重叠)
生活类比 一摞书 书架上并排的书 三明治 (一层压一层)

组合使用 (实战场景)

在实际开发中,通常会将它们嵌套使用。

例子:一个带有背景卡片的图文列表项

plaintext
ZStack {
    // 1. 最底层:背景色
    Color.gray.opacity(0.2)
        .cornerRadius(10)
    
    // 2. 上层:内容布局
    HStack(spacing: 15) {
        Image(systemName: "person.circle") // 左侧头像
            .font(.largeTitle)
        
        VStack(alignment: .leading) {      // 右侧文本区域
            Text("用户名")
                .font(.headline)
            Text("这是用户的个人简介...")
                .font(.subheadline)
        }
        
        Spacer() // 撑开空间
    }
    .padding()
}
.frame(height: 80)

逻辑解析:

  1. ZStack 放背景颜色。
  2. 在背景之上,用 HStack 让头像和文本区域左右并排。
  3. 在文本区域内,用 VStack 让用户名和简介上下排列。
00:00
00:00