ZStack中ProgressView与Circle点击行为差异问题
SwiftUI视图触摸事件差异原因解析
这是因为SwiftUI里不同类型的视图对触摸事件的处理逻辑不一样:
- ProgressView 是系统提供的可交互类视图(哪怕它本身不响应点击操作),默认会拦截并消耗触摸事件。所以点击它时,事件不会传递到下层的绿色背景,背景的
onTapGesture自然不会触发。 - Circle 属于纯形状视图,默认没有交互能力,不会拦截触摸事件。点击它的时候,事件会直接穿透到下层的绿色背景,触发背景的点击手势。
扩展调整方案
如果想让Circle也拦截事件(不让背景点击触发),可以给它加一个空的点击手势:
Circle() .frame(width: 30, height: 30) .onTapGesture {} // 空手势拦截触摸事件
如果想让ProgressView不拦截事件,让背景点击触发,可以禁用它的触摸测试:
ProgressView() .allowsHitTesting(false) // 允许事件穿透到下层视图
内容的提问来源于stack exchange,提问作者Steven-Carrot
相关产品推荐
相关产品推荐

