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

Posted

技术标签:

【中文标题】SwiftUI - 有没有办法在不覆盖子视图的任何手势的情况下向视图添加手势?【英文标题】:SwiftUI - Is there a way to add a gesture to a view without overriding any gestures of the subviews? 【发布时间】:2020-09-15 21:56:32 【问题描述】:

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

【问题讨论】:

这可能对你有帮助:How to hide keyboard when using SwiftUI? 我很欣赏这个链接,但不幸的是我在那里找不到不破坏我的其他一些子视图手势的答案。 你试过我链接的具体答案了吗? 是的,我做到了,我意识到我最初的问题不够清楚。该解决方案几乎可以工作。如果有一个带有点击手势的子视图,那么我希望它注册而不是关闭手势。在该解决方案中,两个水龙头都注册了,而不仅仅是子视图。我编辑了我原来的问题,希望能更清楚。 【参考方案1】:

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

例子

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

【讨论】:

以上是关于SwiftUI - 有没有办法在不覆盖子视图的任何手势的情况下向视图添加手势?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 绑定到父视图重新渲染子视图

从一个 SwiftUI 视图移动到另一个

在 SwiftUI 中拥抱子视图

SWIFTUI:- 有没有办法在滚动滚动视图时关闭弹跳?

有没有办法根据 SwiftUI 中的环境变量更改视图?

有没有办法强制 SwiftUI 中的横向模式仅用于某些视图?