SwiftUI-有没有一种方法可以向视图添加手势而不覆盖子视图的任何手势?

时间:2020-09-15 21:56:32

标签: swiftui gesture

据我所知,在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
      )
  }                  
}

这有点麻烦。我想这样做:

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,但找不到方法。有没有人知道的方法?

1 个答案:

答案 0 :(得分:0)

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

示例

Vstack{
   other subview gestures
}.simultaneousGesture(
    TapGesture()
    .onEnded { _ in
        print("VStack tapped")
    }
)