UITapGestureRecognizer致UICollectionView加载缓慢问题求助
解决方案与思路
问题根源
当给父视图添加双击手势并设置delaysTouchesBegan = true时,系统会延迟将触摸事件传递给子视图(包括UICollectionView)——因为它需要等待一段时间,确认当前触摸是双击而非单点操作。这段延迟会让CollectionView的交互(滚动、cell点击等)响应变慢,看起来像是加载卡顿;而如果设为false,触摸事件会立刻传给子视图,子视图优先处理单点触摸,双击手势就无法捕获完整的两次tap,导致功能失效。
可行解决办法
1. 缩小双击手势的作用范围
不要把双击手势添加到整个控制器的view上,只添加到需要响应双击的区域(比如空白背景视图)。这样手势只会监听指定区域的触摸,完全不会干扰TableView和CollectionView的事件传递,两者的功能都能正常工作。
2. 通过手势代理过滤触摸事件
让双击手势只响应空白区域的触摸,忽略TableView和CollectionView上的触摸:
- 首先设置手势的代理:
tap.delegate = self - 然后实现
UIGestureRecognizerDelegate的代理方法:
这样设置后,即使func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { // 判断触摸点是否落在TableView或CollectionView范围内 let isTouchOnTableView = touch.view?.isDescendant(of: tableView) == true let isTouchOnCollectionView = touch.view?.isDescendant(of: collectionView) == true return !isTouchOnTableView && !isTouchOnCollectionView }delaysTouchesBegan = true,双击手势也不会拦截TableView和CollectionView的触摸事件,子视图的响应速度不受影响,同时空白区域的双击功能正常。
3. 调整手势的事件传递优先级(可选)
如果必须让双击手势在子视图区域也生效,可以使用require(toFail:)方法,但这种场景很少见。比如让TableView的单点触摸手势失败后,双击手势才触发,但这会影响TableView的正常点击功能,所以不推荐。
内容的提问来源于stack exchange,提问作者Codl
相关产品推荐
相关产品推荐

