如何在SwiftUI中的WhatsApp中关闭键盘上的滑动

问题描述

我知道有一些解雇键盘的答案,但是大多数情况下,它们是在敲击键盘外部时触发的。 正如我在问题中所说的,如何实现在滑动(到底部)时关闭键盘

解决方法

UIScrollView具有keyboardDismissMode,当设置为interactive时,将实现您想要的。 SwiftUI对此不提供直接支持,但是由于SwiftUI在后台使用了UIScrollView,因此您可以使用它来将KeyboardDismissMode设置为与应用程序中的所有滚动视图交互。

UIScrollView.appearance().keyboardDismissMode = .interactive

您必须在视图层次结构中具有ScrollView才能起作用。这是演示行为的简单视图:

struct ContentView: View {
    @State private var text = "Hello,world!"

    var body: some View {
        ScrollView {
            TextField("Hello",text: $text)
                .padding()
        }
        .onAppear {
            UIScrollView.appearance().keyboardDismissMode = .interactive
        }
    }
}

唯一的警告是,这会影响应用程序中的所有滚动视图。如果您只想影响应用程序中的一个滚动视图,我不知道一个简单的解决方案。

,

例如,如果您有消息列表,则可以:

List {
    ForEach(...) { ...

    }
}.resignKeyboardOnDragGesture()
extension View {
    func resignKeyboardOnDragGesture() -> some View {
        return modifier(ResignKeyboardOnDragGesture())
    }
}

struct ResignKeyboardOnDragGesture: ViewModifier {
    var gesture = DragGesture().onChanged { _ in
        UIApplication.shared.endEditing(true)
    }
    func body(content: Content) -> some View {
        content.gesture(gesture)
    }
}

通过它来自这里的方式:https://stackoverflow.com/a/58564739/7974174