闽公网安备 35020302035485号
ScrollView {
VStack {
Text("顶部内容")
Spacer()
Text("底部内容")
}
.background(Color.blue)
}
运行后你会发现,背景色只覆盖了文本区域,Spacer 完全没有起到"撑开"的作用。这是为什么呢?
GeometryReader { geometry in
ScrollView {
VStack {
Text("顶部内容")
.font(.title)
.padding()
Spacer()
Text("底部内容")
.font(.title)
.padding()
}
.frame(
maxWidth: .infinity,
minHeight: geometry.size.height
)
.background(Color.blue)
}
}
这里的关键点有两个:2.minHeight: geometry.size.height:确保内容至少占据这个高度,不够的话会自动填充
3.避免了高度过高的问题:不会像 UIScreen.main.bounds.height 那样包含状态栏和底部安全区域
3.完美适配所有设备尺寸和安全区域
struct LoginView: View {
@Stateprivatevar username = ""
@Stateprivatevar password = ""
var body: some View {
GeometryReader { geometry in
ScrollView {
VStack(spacing: 20) {
// 顶部 Logo
Image(systemName: "applelogo")
.font(.system(size: 60))
.foregroundColor(.blue)
Text("欢迎回来")
.font(.title)
.fontWeight(.bold)
Spacer()
// 中间输入框
VStack(spacing: 15) {
TextField("用户名", text: $username)
.textFieldStyle(RoundedBorderTextFieldStyle())
SecureField("密码", text: $password)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button("登录") {
// 登录逻辑
}
.foregroundColor(.white)
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.cornerRadius(10)
}
.padding(.horizontal)
Spacer()
// 堆代码 duidaima.com
// 底部链接
VStack {
Button("忘记密码?") {
// 忘记密码逻辑
}
Button("注册新账户") {
// 注册逻辑
}
}
.font(.footnote)
.foregroundColor(.gray)
}
.frame(
maxWidth: .infinity,
minHeight: geometry.size.height
)
.padding()
}
}
}
}

3.如果键盘弹出导致内容超出屏幕,依然保持可滚动性
// 错误的写法 - 这样不起作用
ScrollView {
VStack {
Text("顶部")
Spacer()
Text("底部")
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
问题:在 ScrollView 中,maxHeight: .infinity 不会起到填充作用,因为 ScrollView 本身就是无限高度的。// 有问题的写法 .frame(maxWidth: .infinity, minHeight: UIScreen.main.bounds.height)问题:这样会导致高度过高,因为 UIScreen.main.bounds.height 包含了状态栏和底部安全区域,在有刘海的设备上会显得过高。
// 错误的写法
VStack {
// 内容
}
.background(Color.blue)
.frame(minHeight: geometry.size.height)
正确的写法应该是:// 正确的写法
VStack {
// 内容
}
.frame(maxWidth: .infinity, minHeight: geometry.size.height)
.background(Color.blue)
原因:SwiftUI 的修饰符是从内到外应用的。背景色需要在设置 frame 之后应用才能覆盖整个区域。3.合理设置 minHeight:确保 minHeight 值合理,避免不必要的空间浪费
4.避免直接使用 maxHeight: .infinity 或 UIScreen.main.bounds.height