如何像 SwiftUI 中的 WhatsApp 一样在滑动时关闭键盘

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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://***.com/a/58564739/7974174

【讨论】:

以上是关于如何像 SwiftUI 中的 WhatsApp 一样在滑动时关闭键盘的主要内容,如果未能解决你的问题,请参考以下文章

如何像 WhatsApp 一样在 PIP 模式下播放 YouTube 视频?

如何像whatsapp一样将图像缓存到特定文件夹

如何像在 whatsapp 中一样在 CollapsingToolbarLayout 中实现字幕

如何在聊天中回复特定消息,就像使用 html css javascript/jquery 的 skype/whatsapp

像whatsapp一样加载联系人

像whatsapp一样修剪视频