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 - 有没有办法在不覆盖子视图的任何手势的情况下向视图添加手势?的主要内容,如果未能解决你的问题,请参考以下文章