我在屏幕顶部附近有一个文本字段,后面是一个间隔符和下面的更多内容。当键盘打开时,文本字段会移到屏幕之外。
我尝试添加
.ignoresSafeArea(.keyboard)
,将 TextField 与其余内容分离到位于 ZStack 中的两个 VStack 中,以及在网上找到的其他一些东西,但到目前为止似乎没有任何效果。
示例:
重现代码:
struct ContentView: View {
@State private var text = ""
var body: some View {
VStack {
TextField("Text", text: $text)
.font(.largeTitle.weight(.medium))
.padding()
Spacer()
VStack {
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
}
.padding()
VStack {
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
}
.padding()
}
.ignoresSafeArea(.keyboard)
}
}
经过一番尝试和错误,我找到了一种方法,使您的文本字段保留在屏幕上(不移动),并且您的文本根本不移动。我必须使用 GeometryReader,出于某种原因,它可以将 TextField 保持在适当的位置,以及带有自定义修改器的 ScrollView,该修改器可以在拖动时关闭键盘:
struct ContentView: View {
@State private var text: String = ""
var body: some View {
GeometryReader { geometry in
ScrollView(.vertical, showsIndicators: false) {
VStack {
TextField("Text", text: $text)
.font(.largeTitle.weight(.medium))
.padding(.top)
VStack {
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
}
.padding()
VStack {
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
Text("Content")
}
.padding()
Spacer(minLength: geometry.safeAreaInsets.bottom) // Add spacer to account for safe area bottom
}
.padding()
.keyboardDismissOnDrag() // Dismiss keyboard on drag
}
}
}
}
extension View {
func keyboardDismissOnDrag() -> some View {
modifier(KeyboardDismissOnDragGesture())
}
}
struct KeyboardDismissOnDragGesture: ViewModifier {
func body(content: Content) -> some View {
content.gesture(DragGesture().onChanged { _ in
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
})
}
}
让我知道你的效果如何!