使用Swift 5.2和iOS 13.4,根据您的需要,您可以使用以下示例之一使您VStack
与最主要的约束条件和全尺寸框架保持一致。
请注意,所有下面的代码段将导致相同的显示,但不能保证在调试视图层次结构时有效的帧框架VStack
或View
可能出现的元素数量。
1.使用frame(minWidth:idealWidth:maxWidth:minHeight:idealHeight:maxHeight:alignment:)
方法
最简单的方法是设置您的框架的VStack
最大宽度和高度,并在frame(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)
}
}
作为替代方案,如果View
在代码库中为s设置具有特定对齐方式的最大帧是常见的模式,则可以为其创建扩展方法View
:
extension View {
func fullSize(alignment: Alignment = .center) -> some View {
self.frame(
maxWidth: .infinity,
maxHeight: .infinity,
alignment: alignment
)
}
}
struct ContentView : View {
var body: some View {
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
}
.fullSize(alignment: .topLeading)
.background(Color.red)
}
}
2.使用Spacer
s强制对齐
您可以将其嵌入VStack
完整尺寸的内部,HStack
并使用tail和bottomSpacer
来强制VStack
顶部对齐:
struct ContentView: View {
var body: some View {
HStack {
VStack(alignment: .leading) {
Text("Title")
.font(.title)
Text("Content")
.font(.body)
Spacer()
}
Spacer()
}
.frame(
maxWidth: .infinity,
maxHeight: .infinity
)
.background(Color.red)
}
}
3.使用ZStack
和全尺寸背景View
本示例说明了如何将您的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
在现有完整尺寸的基础上与最主要的约束条件保持一致View
,可以使用以下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
)
}
}
显示: