SwiftUI:为含子视图onTapGesture的视图添加手势不覆盖原有响应
让SwiftUI父视图与子视图的点击手势同时触发
你碰到的问题是父视图加的onTapGesture把子视图的手势覆盖了,导致点击时只触发父视图的回调。这是因为SwiftUI中直接添加的onTapGesture会和子视图的手势形成事件竞争,优先级更高的会拦截事件传递。
给你两个可行的解决办法:
办法一:用simultaneousGesture替换父视图的onTapGesture
不要给父视图直接添加onTapGesture,改用simultaneousGesture明确告知SwiftUI该手势要与子视图的手势同时响应,而非竞争拦截。修改后的代码如下:
struct NotAPieceOfLettuce: View { var body: some View{ Text("what am I?").onTapGesture{print("I am not a piece of lettuce")} } } struct Banana: View { var body: some View{ NotAPieceOfLettuce() .simultaneousGesture(TapGesture().onEnded { print("just a banana, not lettuce") }) } }
办法二:通过background添加父视图手势
将父视图的手势绑定在子视图的透明背景上,既不会影响原有外观,又能让点击事件同时触发子视图和背景的手势:
struct NotAPieceOfLettuce: View { var body: some View{ Text("what am I?").onTapGesture{print("I am not a piece of lettuce")} } } struct Banana: View { var body: some View{ NotAPieceOfLettuce() .background( Color.clear .onTapGesture { print("just a banana, not lettuce") } ) } }
你之前使用simultaneousGesture没效果,大概率是错误地将它附加在onTapGesture之后——父视图的onTapGesture已经拦截了事件,后续的simultaneousGesture自然无法生效。必须直接用simultaneousGesture定义父视图的手势才行。
内容的提问来源于stack exchange,提问作者WiseEye
相关产品推荐
相关产品推荐

