SwiftUI:键盘显示时跳转页面ScrollView出现额外边距求助
解决SwiftUI键盘避让导致VStack额外抬高的问题
针对iOS16+场景,要保留默认键盘避让功能(让TextField不被键盘遮挡),同时避免包含ScrollView的VStack整体向上抬高,可通过以下修改实现:
1. 让ScrollView占据VStack剩余空间
将ScrollView设置为占满VStack的垂直剩余空间,这样键盘避让只会作用于ScrollView内部内容,VStack底部的视图会保持在屏幕底部,不会随整体上移。修改后代码如下:
struct ContentView: View { @State var text: String = "Bu bu?" var body: some View { NavigationStack { ScrollViewReader { proxy in VStack { ScrollView(showsIndicators: false) { VStack(spacing: 0) { Spacer() .frame(height: 500) TextField("", text: $text) .padding(.bottom, 70) .frame(height: 40) .frame(maxWidth: .infinity) .background(Color.red) // 修复自动校正无效问题 .autocorrectionDisabled(true) NavigationLink("Screen 2", destination: { Text("SwiftUI - Nice to meet you, let's never meet again") }) } } // 关键:让ScrollView占满VStack剩余垂直空间 .frame(maxHeight: .infinity) Text("I'm in VSTack after scroll view") } } } } }
2. 修复自动校正无效问题
你提到disableAutocorrection设置无效,是因为SwiftUI的正确修饰符为.autocorrectionDisabled(true),给TextField添加该修饰符即可关闭自动校正。
原理说明
视图层级中出现的UIInputSetHostView是系统键盘避让机制的一部分,当ScrollView未占据VStack全部剩余空间时,系统会错误地给整个VStack添加额外底部间距,导致容器上移。通过让ScrollView占满垂直空间,系统会将键盘避让的作用范围限制在ScrollView内部,从而消除额外间距。
内容的提问来源于stack exchange,提问作者jarakys
相关产品推荐
相关产品推荐

