在Swift 5.2和iOS 13.4中,根据你的需要,你可以使用下面的例子之一来对齐你的VStack与顶部领先约束和全尺寸框架。
请注意,下面的代码片段都产生相同的显示,但不能保证VStack的有效帧或调试视图层次结构时可能出现的View元素的数量。
1. 使用frame(minWidth:idealWidth:maxWidth:minHeight:idealHeight:maxHeight:alignment:)方法
最简单的方法是设置你的VStack的帧的最大宽度和高度,并在帧中传递所需的对齐(minWidth:idealWidth:maxWidth:minHeight:idealHeight:maxHeight:alignment:):
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
}
.frame(
maxWidth: .infinity,
maxHeight: .infinity,
alignment: .topLeading
)
.background(Color.red)
}
}
2. 使用间隔来强制对齐
你可以将你的VStack嵌入到一个完整大小的HStack中,并使用尾部和底部间隔来强制你的VStack顶部前移对齐:
struct ContentView: View {
var body: some View {
HStack {
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
Spacer() // VStack bottom spacer
}
Spacer() // HStack trailing spacer
}
.frame(
maxWidth: .infinity,
maxHeight: .infinity
)
.background(Color.red)
}
}
3.使用ZStack和一个全尺寸的背景视图
这个例子展示了如何将你的VStack嵌入到一个ZStack中。注意如何使用Color视图来设置最大宽度和高度:
struct ContentView: View {
var body: some View {
ZStack(alignment: .topLeading) {
Color.red
.frame(maxWidth: .infinity, maxHeight: .infinity)
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
}
}
}
}
4. 使用GeometryReader
GeometryReader有以下声明:
容器视图,将其内容定义为其自身大小和坐标空间的函数。[…这个视图返回一个灵活的首选大小给它的父布局。
下面的代码片段展示了如何使用GeometryReader将你的VStack与顶部前导约束和全尺寸框架对齐:
struct ContentView : View {
var body: some View {
GeometryReader { geometryProxy in
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
}
.frame(
width: geometryProxy.size.width,
height: geometryProxy.size.height,
alignment: .topLeading
)
}
.background(Color.red)
}
}
5. 使用overlay(_:alignment:)方法
如果你想在现有的全尺寸视图的顶部对齐你的VStack,你可以使用overlay(_:alignment:)方法:
struct ContentView: View {
var body: some View {
Color.red
.frame(
maxWidth: .infinity,
maxHeight: .infinity
)
.overlay(
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
},
alignment: .topLeading
)
}
}
显示: