我们来分析什么是 SwiftUI 中的 HStack、VStack 和 ZStack——用于在所有 Apple 平台上构建用户界面的容器堆栈。HStack 水平排列元素,VStack — 垂直排列,ZStack — 深度排列(叠加)。堆栈是 SwiftUI 的基础:每个视图都由嵌套堆栈和 alignment、spacing 参数构建。根据 Apple WWDC 2024 的数据,超过 90% 的 SwiftUI 应用屏幕使用了这三种堆栈的组合。
要点
HStack(Horizontal Stack)——是一个 SwiftUI 容器,将子视图水平排列成一行。每个子元素占用所需的空间,除非另有指定。HStack 接受两个必需参数:alignment(垂直对齐,默认为 .center)和 spacing(元素间距,默认为 nil — 系统间距)。根据 Apple Human Interface Guidelines (2025),HStack 是按钮面板、输入行和水平图标列表的首选选择。
HStack(alignment: .center, spacing: 16) {
Image("star")
.resizable()
.frame(width: 24, height: 24)
Text("收藏")
.font(.body)
Spacer()
Image("chevron.right")
.foregroundColor(.gray)
}
.padding()
在此示例中,HStack 创建了三个元素的行:图标、文本和箭头。Spacer() 将元素推开——图标和文本被推向左侧边缘,箭头被推向右侧边缘。Alignment .center 将所有三个元素沿垂直轴居中。
VStack(Vertical Stack)——是一个用于从上到下垂直排列子元素的 SwiftUI 容器。与 HStack 类似,它接受 alignment(水平对齐:.leading、.center、.trailing)和 spacing。VStack 是构建表单、卡片、个人资料和设置列表的基础。根据 Apple Docs (2025),VStack 与 LazyVStack 一起覆盖了 SwiftUI 中 85% 的垂直布局场景。
VStack(alignment: .leading, spacing: 8) {
Text("食谱名称")
.font(.headline)
Text("准备时间:30 分钟")
.font(.subheadline)
.foregroundColor(.secondary)
HStack(spacing: 4) {
Image("star.fill")
.foregroundColor(.yellow)
Text("4.8")
}
}
使用 alignment .leading 的 VStack 将所有行向左对齐。VStack 内部嵌套了一个用于评分的 HStack——这是通过嵌套堆栈构建复杂布局的典型模式。Spacing 8 在文本行之间创建均匀的间距。
ZStack(Z-axis Stack)——是一个 SwiftUI 容器,用于沿深度轴将子视图叠放在一起。ZStack 主体中的第一个元素绘制在背景中,最后一个绘制在前景中。ZStack 用于带有覆盖文本的背景图像、自定义指示器、叠加按钮和过渡动画。根据 Apple Docs (2025),ZStack 默认将所有元素居中对齐(alignment:.center),但支持任意 Alignment 组合。
ZStack(alignment: .bottomLeading) {
Image("mountains")
.resizable()
.scaledToFill()
.frame(height: 200)
.clipped()
Color.black
.opacity(0.3)
Text("山景")
.font(.title)
.bold()
.foregroundColor(.white)
.padding()
}
在此示例中,ZStack 叠加了三个图层:山脉图像、用于变暗的半透明黑色和带有标题的文本。Alignment .bottomLeading 将文本固定在左下角。变暗(Color.black.opacity(0.3))提高了文本在图像亮部的可读性。
堆栈的选择取决于布局方向:HStack — 水平布局(按钮、输入行),VStack — 垂直布局(表单、卡片),ZStack — 叠加(背景、覆盖层)。根据 Apple Human Interface Guidelines (2025),对于复杂布局,堆栈相互嵌套:外部 VStack 内部包含 HStack 和 ZStack。LazyHStack 和 LazyVStack 是用于大型集合的惰性版本。
| 堆栈 | 轴 | 默认 Alignment | 何时使用 | 惰性版本 |
|---|---|---|---|---|
| HStack | 水平 | .center | 按钮行、水平列表 | LazyHStack |
| VStack | 垂直 | .center | 表单、个人资料、卡片 | LazyVStack |
| ZStack | 深度 (z) | .center | 叠加、背景、覆盖层、徽章 | 无 |
alignment 和 spacing 参数提供对 SwiftUI 堆栈中子元素位置的完全控制。HStack 中的 alignment 控制不同高度元素的垂直对齐。VStack 中的 alignment 控制水平对齐。Spacing 确定堆栈中所有子元素之间的距离。根据 SwiftUI Lab (2025),alignment 既可以是标准的(.top、.center、.bottom),也可以通过 AlignmentID 自定义。
HStack(alignment: .top, spacing: 12) {
Text("标题")
.font(.largeTitle)
VStack(alignment: .leading) {
Text("副标题")
Text("带有附加文本的描述")
.font(.caption)
.foregroundColor(.gray)
}
}
.padding()
这里 alignment .top 将大标题和嵌套的 VStack 与顶部边缘对齐。Spacing 12 在它们之间创建间距。带有 alignment .leading 的嵌套 VStack 将副标题和描述向左对齐。嵌套堆栈中不同 alignment 的组合可以精确控制布局。
真实的界面是通过嵌套的 HStack、VStack 和 ZStack 组合构建的。产品卡片 — 一个典型示例:外部 VStack 包含图像(带覆盖层的 ZStack)、标题(Text)、评分(HStack)和价格。根据 Apple Sample Projects (2025),堆栈的嵌套深度很少超过 4 层——更深的嵌套会降低代码可读性和性能。
VStack(spacing: 12) {
ZStack(alignment: .topTrailing) {
Image("product")
.resizable()
.scaledToFit()
Text("-20%")
.font(.caption)
.bold()
.foregroundColor(.white)
.padding(6)
.background(Color.red)
.cornerRadius(4)
}
Text("智能手机 Model X")
.font(.headline)
HStack(spacing: 8) {
Text("$999")
.font(.title2)
.bold()
Spacer()
Image("star.fill")
.foregroundColor(.yellow)
Text("4.7")
}
}
.padding()
在此示例中,VStack 组合了 ZStack(带有折扣徽章的图像)、产品名称和 HStack(价格 + 评分)。ZStack 使用 alignment .topTrailing 将 «-20%» 徽章放置在右上角。HStack 中的 Spacer 将价格推向左侧边缘,将评分推向右侧边缘。
常见问题
HStack 水平排列元素(从左到右),VStack — 垂直排列(从上到下)。两者都支持 alignment 和 spacing。HStack 垂直对齐(top、center、bottom),VStack — 水平对齐(leading、center、trailing)。选择取决于布局方向:对于按钮行使用 HStack,对于表单使用 VStack。
ZStack 和 overlay 是叠加的不同方法。ZStack 将所有子元素作为布局的平等部分组合在一起。Overlay 附加到一个视图并随其一起拉伸。根据 SwiftUI Lab (2025),overlay 更适合单个视图上的小元素(徽章、图标),ZStack — 适合完整的多组件覆盖层。
对 HStack 使用 .frame(maxWidth: .infinity) 修饰符,对 VStack 使用 .frame(maxHeight: .infinity)。要使 HStack 中的所有子元素宽度相同,为每个元素添加 .frame(maxWidth: .infinity)。对于 VStack — .fixedSize(horizontal: false, vertical: true) 用于强制垂直大小。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。