【问题标题】:How to dismiss keyboard on swipe like in WhatsApp in SwiftUI如何像 SwiftUI 中的 WhatsApp 一样在滑动时关闭键盘
【发布时间】:2020-08-28 12:12:46
【问题描述】:

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

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    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
            }
        }
    }
    

    唯一需要注意的是,这会影响您应用中的所有滚动视图。如果您只想影响应用中的一个滚动视图,我不知道有什么简单的解决方案。

    【讨论】:

    • 这个答案似乎很有效,谢谢,我不能投票,因为我的声誉不够,但你可以投票给我的问题 :)
    • 马克,我发现使用它会导致表情符号键盘在尝试水平滚动表情符号时奇怪地缩小到你的指尖 - 你知道是否有办法解决这个问题?谢谢!
    【解决方案2】:

    例如,如果您有一个消息列表,那么您可以:

    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

    【讨论】:

      猜你喜欢
      • 2020-02-20
      • 2020-11-10
      • 2014-05-25
      • 2016-09-08
      • 2020-05-17
      • 2014-01-23
      • 2020-02-09
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多