SwiftUI:如何使遮罩视图响应手势,避免被被遮罩视图阻挡?
解决SwiftUI遮罩视图无法响应手势的问题
你遇到的问题本质是:SwiftUI的mask修饰符里的视图仅用于提供裁剪形状,默认不会参与交互事件传递,所以哪怕给BackgroundView加了allowsHitTesting(false),遮罩里的InteractiveView也接不到手势。
给你两个可行的方案:
方案一:分离裁剪与交互层级
把负责交互的InteractiveView单独放在ZStack的上层,用它的副本做BackgroundView的遮罩,同时让上层的InteractiveView只负责响应手势(可设为透明不遮挡背景):
ZStack { // 被裁剪的背景视图 BackgroundView() .mask(InteractiveView()) // 用InteractiveView的形状裁剪背景 // 负责响应手势的遮罩视图,透明不遮挡背景 InteractiveView() .opacity(0) .allowsHitTesting(true) }
方案二:用背景+遮罩组合
如果InteractiveView本身需要显示,直接把它作为前景,BackgroundView作为它的背景并被它的形状裁剪:
InteractiveView() .background( BackgroundView() .mask(InteractiveView()) )
这两种方案都能让InteractiveView正常响应手势,同时BackgroundView保持被遮罩的显示效果。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

