UITableViewCell内嵌SwiftHSVColorPicker时滑动冲突问题求助
解决SwiftHSVColorPicker与UITableView的滑动冲突问题
我之前在项目里把颜色选择器放进TableViewCell时也踩过这个手势冲突的坑,给你几个能彻底解决的方案,按你的需求选就行:
方案一:通过手势识别器代理拦截冲突
SwiftHSVColorPicker内部自带了处理拖动/滑动的手势,我们可以通过设置这些手势的代理,让它们优先响应,阻止TableView的滚动手势同时触发:
- 给你的TableViewCell遵循
UIGestureRecognizerDelegate协议 - 在初始化颜色选择器时,遍历它的所有手势并设置代理:
class ColorPickerTableViewCell: UITableViewCell, UIGestureRecognizerDelegate { @IBOutlet weak var colorPicker: SwiftHSVColorPicker! override func awakeFromNib() { super.awakeFromNib() // 给颜色选择器的所有手势设置代理 colorPicker.gestureRecognizers?.forEach { $0.delegate = self } } // 禁止颜色选择器手势和TableView滚动手势同时触发 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return false } // 确保只有触摸在颜色选择器范围内时,才触发它的手势 func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { let touchLocation = gestureRecognizer.location(in: colorPicker) return colorPicker.bounds.contains(touchLocation) } }
方案二:操作颜色选择器时临时禁用TableView滚动
你已经有了控制TableView滚动的代理协议,可以进一步完善逻辑,在用户开始操作颜色选择器时禁用滚动,操作结束后恢复:
- 在TableViewCell中监听颜色选择器的手势状态:
protocol TableViewScrollDelegate: AnyObject { func disableTableViewScroll() func enableTableViewScroll() } class ColorPickerTableViewCell: UITableViewCell { @IBOutlet weak var colorPicker: SwiftHSVColorPicker! weak var scrollDelegate: TableViewScrollDelegate? override func awakeFromNib() { super.awakeFromNib() // 给每个手势添加状态监听 colorPicker.gestureRecognizers?.forEach { $0.addTarget(self, action: #selector(handleColorPickerGesture(_:))) } } @objc private func handleColorPickerGesture(_ gesture: UIGestureRecognizer) { switch gesture.state { case .began, .changed: scrollDelegate?.disableTableViewScroll() case .ended, .cancelled, .failed: scrollDelegate?.enableTableViewScroll() default: break } } }
- 在你的ViewController中实现代理方法:
class YourViewController: UIViewController, TableViewScrollDelegate { @IBOutlet weak var tableView: UITableView! func disableTableViewScroll() { tableView.isScrollEnabled = false } func enableTableViewScroll() { tableView.isScrollEnabled = true } // 在cellForRowAt中设置代理 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ColorPickerCell", for: indexPath) as! ColorPickerTableViewCell cell.scrollDelegate = self return cell } }
额外注意点
- 确保颜色选择器的
isUserInteractionEnabled属性为true,并且它的父视图(比如cell的contentView)也没有禁用用户交互 - 如果颜色选择器的frame设置不正确,触摸点可能落在它的范围外,导致手势还是被TableView捕获,要检查布局是否准确
内容的提问来源于stack exchange,提问作者niravdesai21
相关产品推荐
相关产品推荐

