SwiftUI - 有没有办法向视图添加手势而不覆盖子视图的任何手势?

Ste*_*zee 4 gesture swiftui

据我所知,在 SwiftUI 中从 TextField 中关闭键盘的唯一内置方法是按 Return 键。我想这样做,这样我就可以点击屏幕上除 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
      )
  }                  
}
Run Code Online (Sandbox Code Playgroud)

那就有点麻烦了。我想这样做:

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
  )          
}
Run Code Online (Sandbox Code Playgroud)

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

Leo*_*nth 7

我们可以使用同步手势。它将在不阻止任何其他子视图手势的情况下工作。

例子

Vstack{
   other subview gestures
}.simultaneousGesture(
    TapGesture()
    .onEnded { _ in
        print("VStack tapped")
    }
)
Run Code Online (Sandbox Code Playgroud)