如何阻止 SwiftUI 在键盘打开时向上移动 TextField?

问题描述 投票:0回答:1

我在屏幕顶部附近有一个文本字段,后面是一个间隔符和下面的更多内容。当键盘打开时,文本字段会移到屏幕之外。

我尝试添加

.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)
    }
}
ios swiftui textfield
1个回答
0
投票

经过一番尝试和错误,我找到了一种方法,使您的文本字段保留在屏幕上(不移动),并且您的文本根本不移动。我必须使用 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)
        })
    }
}

让我知道你的效果如何!

© www.soinside.com 2019 - 2024. All rights reserved.