【问题标题】:Keyboard not dismissing in SwiftUI with onTapGesture使用 onTapGesture 在 SwiftUI 中键盘不会消失
【发布时间】:2021-07-13 20:51:33
【问题描述】:

当用户在 TextField 之外点击时,我正在尝试锻炼如何在 SwiftUI 中关闭键盘。我关注了其他一些帖子,这些帖子建议在 VStack 上使用 onTapGesture 并扩展 View 协议以提供一种方法来关闭从 onTapGesture 调用的键盘。

这是我的内容视图:

struct ContentView: View {
    @State var text = ""
    var body: some View {
        VStack{
            Spacer()
            TextField("Text", text: $text)
            Text("\(text)")
            Spacer()
        }
        .onTapGesture {
            dismissKeyboard()
        }
    }
}

我已经扩展了 View 协议:

extension View {
    func dismissKeyboard() {
        print("dismissing keyboard")
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
}

当我运行应用程序时,只有在我点击 Text() 区域时才会关闭键盘。我会理解如果 Spacers 不存在为什么会发生这种情况,因为 VStack 仅填充它包含的视图所需的区域,但我希望当 VStack 被推到顶部时,间隔将允许 onTapGesture 为整个屏幕工作和屏幕底部,但它仍然只在点击 Text() 时有效。

当我点击 Spacers 所在的位置时 onTapGesture 不起作用并且仅在 Text 所在的位置起作用时,是否有原因?

【问题讨论】:

  • 如果您将.background(Color.red) 添加到 VStack 中,它将起作用。似乎 TextField 或双 Spacers 可能会导致框架变得奇怪。我不知道为什么。

标签: ios swift swiftui


【解决方案1】:

你需要像这样设置一个非空背景:

        ZStack {
            Color.white.opacity(0.0000001)
            VStack {
                TextField("Text", text: $text)
                Text("\(text)")
            }
        }
        .onTapGesture {
             dismissKeyboard()
        }

SwiftUI 总是忽略它认为是空白区域的手势。
例如Color.white.opacity(0) 也将被视为空白,如果您这样做,点击手势将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多