如何在UITableViewCell中添加单双击手势时屏蔽didSelectRowAt响应
在UITableViewCell内实现单双击手势并屏蔽didSelectRowAt
完全可以在UITableViewCell类内部实现这个需求,核心是让Cell的手势优先拦截触摸事件,同时禁用Cell的默认选中行为。以下是具体实现步骤和代码:
关键思路
- 禁用Cell的默认选中样式,切断触发
didSelectRowAt的基础条件 - 正确配置单双击手势的依赖关系,确保双击优先识别
- 通过手势代理阻止事件传递到TableView,确保只有自定义手势响应点击
完整代码实现
import UIKit class CustomTapCell: UITableViewCell { // 声明单双击手势 private var singleTap: UITapGestureRecognizer! private var doubleTap: UITapGestureRecognizer! override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setupGestures() } required init?(coder: NSCoder) { super.init(coder: coder) setupGestures() } private func setupGestures() { // 1. 禁用默认选中样式 selectionStyle = .none // 2. 配置双击手势 doubleTap = UITapGestureRecognizer(target: self, action: #selector(onDoubleTap(_:))) doubleTap.numberOfTapsRequired = 2 addGestureRecognizer(doubleTap) // 3. 配置单击手势,并设置依赖 singleTap = UITapGestureRecognizer(target: self, action: #selector(onSingleTap(_:))) singleTap.numberOfTapsRequired = 1 // 双击识别失败时才触发单击 singleTap.require(toFail: doubleTap) addGestureRecognizer(singleTap) // 4. 设置手势代理,拦截事件传递 singleTap.delegate = self doubleTap.delegate = self } // 单击回调 @objc private func onSingleTap(_ gesture: UITapGestureRecognizer) { print("执行Cell单击逻辑") // 这里替换成你的自定义单击处理 } // 双击回调 @objc private func onDoubleTap(_ gesture: UITapGestureRecognizer) { print("执行Cell双击逻辑") // 这里替换成你的自定义双击处理 } } // 实现手势代理,阻止事件传递到TableView extension CustomTapCell: UIGestureRecognizerDelegate { func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { // 不允许和其他手势(如TableView的点击手势)同时识别 return false } }
注意事项
selectionStyle = .none必须设置,否则即使手势拦截了事件,Cell的选中状态仍可能触发didSelectRowAt- 手势依赖的顺序不能搞反,必须是单击手势依赖双击手势失败,才能保证双击优先响应
- 代理方法
shouldRecognizeSimultaneouslyWith返回false是关键,它确保手势处理完触摸事件后,不会再传递给TableView的点击事件处理器
内容的提问来源于stack exchange,提问作者Uzy
相关产品推荐
相关产品推荐

