SwiftUI - 是否有一种方法可以在不覆盖子视图手势的情况下向视图添加手势?

4
据我所知,在SwiftUI中,唯一内置的关闭TextField键盘的方法是按回车。我想让它可以通过在TextView以外的屏幕某个位置轻触来关闭键盘。有一种这样的方法:
var body: some View {
  VStack(alignment: .center, spacing: 0) {
    Text("some text")
      .frame(maxWidth: .infinity)
      .contentShape(Rectangle())
      .onTapGesture(
        // dismiss keyboard here
      )

    TextField("text", $binding)

    Text("more text")
      .frame(maxWidth: .infinity)
      .contentShape(Rectangle())
      .onTapGesture(
        // dismiss keyboard here
      )
  }                  
}

这有点繁琐。我希望能以这种方式完成:

var body: some View {
  VStack(alignment: .center, spacing: 0) {
    Text("some text")

    TextField("text", $binding)

    Text("more text")
  } 
  .frame(maxWidth: .infinity)
  .contentShape(Rectangle())
  .onTapGesture(
    // dismiss keyboard here
  )          
}

这基本上有效,但最外层视图的手势会覆盖文本字段的手势。当您第一次按下文本字段时,键盘会显示,但再次按下时会消失,而我不想要这种情况。我希望子视图手势优先。如果VStack中有一个按钮,它应该仅注册按钮并且不包括隐藏手势。我正在研究GestureMask和ExclusiveGesture,但是我找不到方法。有人知道吗?


这可能会对你有所帮助:如何在使用SwiftUI时隐藏键盘? - pawello2222
我很感谢提供的链接,但不幸的是,我在那里没有找到一个答案,它不会破坏我的其他子视图手势。 - Steve Frazee
你尝试过我提供的特定答案了吗? - pawello2222
是的,我明白了,我意识到我在最初的问题中表述不够清楚。那个解决方案几乎可以工作。如果有一个带有轻拍手势的子视图,则我希望它能被注册而不是dismiss手势。在那个解决方案中,两个轻拍都被注册了,而不仅仅是子视图。我编辑了我的原始问题,希望更加清晰明了。 - Steve Frazee
1个回答

7
我们可以使用`simultaneousGesture`。它将在不阻塞任何其他子视图手势的情况下工作。
示例:
Vstack{
   other subview gestures
}.simultaneousGesture(
    TapGesture()
    .onEnded { _ in
        print("VStack tapped")
    }
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接