iOS 26下UITargetedPreview不响应触摸问题咨询(UICollectionView场景)
iOS 16(推测你提到的iOS 26为笔误)UICollectionView上下文菜单预览视图触摸无响应问题修复
相关API变更说明
iOS 16对UIContextMenu的预览交互逻辑做了调整:系统默认会拦截UITargetedPreview视图的触摸事件,优先用于处理上下文菜单的收起操作,导致自定义预览视图内的子控件(比如按钮)无法接收到触摸事件,表现为点击按钮时菜单直接关闭。
修复方案
方案1:配置UITargetedPreview参数允许用户交互
创建UITargetedPreview时,通过UITargetedPreview.Parameters的interaction属性明确允许预览视图内的交互操作,这是最直接的修复方式:
func collectionView(_ collectionView: UICollectionView, contextMenuConfiguration configuration: UIContextMenuConfiguration, highlightPreviewForItemAt indexPath: IndexPath) -> UITargetedPreview? { let customPreviewView = YourCustomPreviewView() // 初始化参数并设置交互权限 let previewParams = UITargetedPreview.Parameters() previewParams.interaction = .allowUserInteraction return UITargetedPreview(view: customPreviewView, parameters: previewParams) }
方案2:重写预览视图的hitTest方法确保事件传递
如果方案1未生效,可以在自定义预览视图中重写hitTest(_:with:)方法,强制让按钮类控件接收触摸事件:
class YourCustomPreviewView: UIView { override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { let result = super.hitTest(point, with: event) // 仅拦截按钮的触摸事件,其他交给系统处理 if result is UIButton { return result } return super.hitTest(point, with: event) } }
额外检查项
- 确认自定义预览视图的
isUserInteractionEnabled属性为true(默认值为true,若被手动修改需重置) - 检查按钮的frame是否完全包含在预览视图范围内,超出边界的部分无法响应触摸
内容的提问来源于stack exchange,提问作者Ugur
相关产品推荐
相关产品推荐

