HStack:什么是它,SwiftUI 中的 HStack VStack ZStack

作者: IT Sectr 发布日期: 2026-02-24 阅读时间: 7 分钟

我们来分析什么是 SwiftUI 中的 HStack、VStack 和 ZStack——用于在所有 Apple 平台上构建用户界面的容器堆栈。HStack 水平排列元素,VStack — 垂直排列,ZStack — 深度排列(叠加)。堆栈是 SwiftUI 的基础:每个视图都由嵌套堆栈和 alignment、spacing 参数构建。根据 Apple WWDC 2024 的数据,超过 90% 的 SwiftUI 应用屏幕使用了这三种堆栈的组合。

要点

  • HStack — SwiftUI 的水平堆栈,将子元素从左到右排列成一行。
  • VStack — SwiftUI 的垂直堆栈,将元素从上到下排列并设置对齐方式。
  • ZStack — SwiftUI 的深度堆栈,用于沿 Z 轴将元素叠放在一起。
  • 所有三种堆栈都支持 alignment(对齐)和 spacing(元素间距)参数。
  • 根据 Apple Docs (2025),堆栈会自动适应内容,但可以通过 frame(maxWidth: .infinity) 扩展到所有可用空间。

SwiftUI 中的 HStack 是什么?

HStack(Horizontal Stack)——是一个 SwiftUI 容器,将子视图水平排列成一行。每个子元素占用所需的空间,除非另有指定。HStack 接受两个必需参数:alignment(垂直对齐,默认为 .center)和 spacing(元素间距,默认为 nil — 系统间距)。根据 Apple Human Interface Guidelines (2025),HStack 是按钮面板、输入行和水平图标列表的首选选择。

Swift
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:垂直布局和对齐

VStack(Vertical Stack)——是一个用于从上到下垂直排列子元素的 SwiftUI 容器。与 HStack 类似,它接受 alignment(水平对齐:.leading、.center、.trailing)和 spacing。VStack 是构建表单、卡片、个人资料和设置列表的基础。根据 Apple Docs (2025),VStack 与 LazyVStack 一起覆盖了 SwiftUI 中 85% 的垂直布局场景。

Swift
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:深度叠加元素

ZStack(Z-axis Stack)——是一个 SwiftUI 容器,用于沿深度轴将子视图叠放在一起。ZStack 主体中的第一个元素绘制在背景中,最后一个绘制在前景中。ZStack 用于带有覆盖文本的背景图像、自定义指示器、叠加按钮和过渡动画。根据 Apple Docs (2025),ZStack 默认将所有元素居中对齐(alignment:.center),但支持任意 Alignment 组合。

Swift
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 比较:何时使用哪种

堆栈的选择取决于布局方向: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:堆栈的微调

alignmentspacing 参数提供对 SwiftUI 堆栈中子元素位置的完全控制。HStack 中的 alignment 控制不同高度元素的垂直对齐。VStack 中的 alignment 控制水平对齐。Spacing 确定堆栈中所有子元素之间的距离。根据 SwiftUI Lab (2025),alignment 既可以是标准的(.top、.center、.bottom),也可以通过 AlignmentID 自定义。

Swift
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 层——更深的嵌套会降低代码可读性和性能。

Swift
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 有什么区别?

HStack 水平排列元素(从左到右),VStack — 垂直排列(从上到下)。两者都支持 alignment 和 spacing。HStack 垂直对齐(top、center、bottom),VStack — 水平对齐(leading、center、trailing)。选择取决于布局方向:对于按钮行使用 HStack,对于表单使用 VStack。

何时使用 ZStack 而不是 overlay?

ZStack 和 overlay 是叠加的不同方法。ZStack 将所有子元素作为布局的平等部分组合在一起。Overlay 附加到一个视图并随其一起拉伸。根据 SwiftUI Lab (2025),overlay 更适合单个视图上的小元素(徽章、图标),ZStack — 适合完整的多组件覆盖层。

如何使 SwiftUI 堆栈中的元素大小相同?

对 HStack 使用 .frame(maxWidth: .infinity) 修饰符,对 VStack 使用 .frame(maxHeight: .infinity)。要使 HStack 中的所有子元素宽度相同,为每个元素添加 .frame(maxWidth: .infinity)。对于 VStack — .fixedSize(horizontal: false, vertical: true) 用于强制垂直大小。

总结

  • HStack — 使用 alignment 和 spacing 参数从左到右水平排列元素。
  • VStack — 从上到下垂直排列元素,表单和卡片的基础。
  • ZStack — 沿深度轴叠加元素,用于背景、覆盖层和徽章。
  • 堆栈相互嵌套以构建最大深度为 4 层的复杂布局。
  • HStack 中的 alignment 控制垂直对齐,VStack 中控制水平对齐,ZStack 中控制所有轴的对齐。
  • Spacer() 在堆栈内部创建灵活的间隙,将元素推向边缘。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读