iOS 18下ZStack子视图触摸事件被顶层视图拦截的解决方法咨询
iOS 18下ZStack子视图触摸事件响应问题解决方案
针对iOS 18中ZStack顶层视图拦截所有触摸事件,导致下层并排子视图无法响应的问题,可尝试以下几种解决方法:
设置UIView不独占触摸
在你的pressableView对应的UIViewRepresentable实现中,给生成的UIView添加exclusiveTouch = false配置,允许同一层级的其他视图接收触摸事件:func makeUIView(context: Context) -> UIView { let view = UIView() view.isUserInteractionEnabled = true view.exclusiveTouch = false // 关键设置 return view }确保触摸事件正常传递
如果你的UIViewRepresentable重写了touchesBegan等触摸处理方法,务必调用父类方法让事件继续向下传递,不要直接拦截:override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) // 保留事件传递链 // 你的自定义触摸处理逻辑 }替换为SwiftUI原生可点击组件
尽量避免依赖UIViewRepresentable,改用SwiftUI原生的手势或按钮实现可点击区域,适配iOS 18的触摸机制:@ViewBuilder private var pressableViews: some View { ZStack(alignment: .top) { ForEach(Array(positions.enumerated()), id: \.1.id) { index, link in // 自定义内容视图 YourContentView(link: link) .contentShape(Rectangle()) // 指定可点击区域 .onTapGesture { // 处理点击逻辑 } } } }提升子视图触摸优先级
给需要优先响应的子视图添加highPriorityGesture,强制其优先处理触摸事件,避免被顶层视图拦截:pressableView(link: link, index: index) .highPriorityGesture(TapGesture().onEnded { // 执行点击逻辑 })
内容的提问来源于stack exchange,提问作者Smiless
相关产品推荐
相关产品推荐

