在SwiftUI中,我如何执行手势操作但将手势传递到它后面的视图?

8

我正在创建一个提示框系统。

如果用户点击提示框外部的任何位置,我希望可以关闭提示框。

我想让触摸提示框外部既可以关闭提示框,又可以激活用户点击的任何控件。 (这样你可以打开一个提示框,并在提示框外面点击按钮,第一次点击时它会被激活。)

为了实现这个功能,我有一个不可见的视图处理触摸事件并关闭提示框,但我不知道如何使 SwiftUI 不拦截和取消触摸事件。在 Web 上,相当于不调用 event.stopPropagation()event.preventDefault() 或者在 UIKit 中的 touchesBegan: 方法中调用 super

有什么想法吗?

2个回答

15

这是一种可能的方法演示。已在Xcode 11.4 / iOS 13.4上测试过。

struct ContentView: View {
    var body: some View {
        VStack {
            Button("Button") { print("> button tapped")}
        }
        .frame(width: 200, height: 200)
        .contentShape(Rectangle())       // makes all area tappable
        .simultaneousGesture(TapGesture().onEnded({
             print(">>> tooltip area here")
        }))
        .border(Color.red)   // just for demo show area
    }
}

1
谢谢。你救了我的一天。我遇到了PDFView和上面的按钮不接受触摸事件的问题。 - Vladimir

3

您需要使用此修饰符:

.allowsHitTesting(false)

3
这并没有回答我的问题。我需要允许命中测试以处理轻拍手势来关闭工具提示。但是我也希望我的轻拍手势影响到那个视图后面的视图。 - Wil Gieseler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接