在你已经了解了SwiftUI的基础知识并掌握了如何显示文本内容后,现在是时候学习如何布局用户界面了。
上一篇 SwiftUI 图片视图 介绍了 SwiftUI 中使用 Image
显示图片。
今天我们介绍 SwiftUI 中使用 VStack
、HStack
和 ZStack
进行布局。
在本教程中,我们将深入探讨SwiftUI中的堆栈布局,包括VStack
、HStack
和ZStack
,
并展示如何通过这些堆栈构建复杂的网格布局。通过逐步构建一个简单的网格界面,你将学会如何有效地组合视图,
创建出理想的用户界面。
目录
- 什么是SwiftUI中的堆栈
- 理解VStack、HStack和ZStack
- 创建一个新的SwiftUI项目
- 使用VStack
- 使用HStack
- 提取视图以组织代码
- 使用ZStack
- 使用Spacer进行布局调整
- 练习:创建一个网格布局
- 总结
什么是SwiftUI中的堆栈
堆栈(Stacks)是SwiftUI中用于组合视图的核心组件。通过在水平(HStack)和垂直(VStack)堆栈中组合视图, 你可以构建出复杂且响应式的用户界面。在UIKit中,构建适应不同屏幕尺寸的界面通常需要使用自动布局(Auto Layout), 这对于初学者来说可能较为复杂。而在SwiftUI中,堆栈简化了这一过程,使得布局更加直观和易于掌握。
理解VStack、HStack和ZStack
SwiftUI提供了三种主要的堆栈类型,帮助开发者以不同的方向组合视图:
VStack
:垂直堆叠视图,将子视图按垂直方向排列。HStack
:水平堆叠视图,将子视图按水平方向排列。ZStack
:叠加堆叠视图,将子视图层层叠加在一起。
下图展示了这三种堆栈如何组织视图:
创建一个新的SwiftUI项目
首先,启动Xcode并创建一个新的项目:
- 打开Xcode,选择创建一个新的Xcode项目。
- 在iOS类别下选择App模板,然后点击下一步。
- 输入项目名称,例如
SwiftUIStacks
。组织名称可以填写你的公司或组织名称,如com.yourcompany
。 - 在用户界面(User Interface)选项中选择SwiftUI,语言选择Swift。
- 点击下一步,选择一个文件夹来保存项目。
创建项目后,Xcode将自动加载ContentView.swift
文件并显示设计/预览画布。
如果看不到预览,可以通过Xcode菜单选择Editor > Canvas来启用。
使用VStack
让我们从构建一个简单的垂直堆叠视图开始。假设我们要显示一个标题和副标题,可以使用VStack
来垂直排列两个Text
视图。
示例:创建一个垂直堆叠视图
struct ContentView: View {
var body: some View {
VStack {
Text("Choose")
.font(.system(.largeTitle, design: .rounded))
.fontWeight(.black)
Text("Your Plan")
.font(.system(.largeTitle, design: .rounded))
.fontWeight(.black)
}
}
}
调整对齐方式和间距
默认情况下,VStack
中的视图是居中的。要将它们左对齐,并调整视图之间的间距,可以使用alignment
和spacing
参数:
VStack(alignment: .leading, spacing: 2) {
Text("Choose")
.font(.system(.largeTitle, design: .rounded))
.fontWeight(.black)
Text("Your Plan")
.font(.system(.largeTitle, design: .rounded))
.fontWeight(.black)
}
这样,两个文本视图将垂直排列,并且左对齐,间距为2点。
使用HStack
接下来,我们将布局两个价格计划:Basic和Pro。这两个计划的布局非常相似,因此可以使用VStack
来组合每个计划的内容,并使用HStack
将它们水平排列。
示例:创建水平堆叠视图
HStack {
VStack {
Text("Basic")
.font(.system(.title, design: .rounded))
.fontWeight(.black)
.foregroundColor(.white)
Text("$9")
.font(.system(size: 40, weight: .heavy, design: .rounded))
.foregroundColor(.white)
Text("per month")
.font(.headline)
.foregroundColor(.white)
}
.padding(40)
.background(Color.purple)
.cornerRadius(10)
VStack {
Text("Pro")
.font(.system(.title, design: .rounded))
.fontWeight(.black)
Text("$19")
.font(.system(size: 40, weight: .heavy, design: .rounded))
Text("per month")
.font(.headline)
.foregroundColor(.gray)
}
.padding(40)
.background(Color(red: 240/255, green: 240/255, blue: 240/255))
.cornerRadius(10)
}
在这个示例中,HStack
将两个VStack
水平排列,每个VStack
代表一个价格计划。
通过调整padding
、background
和cornerRadius
修饰符,我们可以美化每个计划的外观。
设置堆叠间距
为了在Basic和Pro计划之间添加一些间距,可以在HStack
中使用spacing
参数:
HStack(spacing: 15) {
// Basic 和 Pro 计划的 VStack
}