折线图横向拖动时如何阻止TableView同步上下滚动?
解决TableView内嵌折线图时的滚动冲突问题
以下是几种可行的解决方案,针对你遇到的拖动折线图时TableView同步滚动的问题:
方案一:通过手势识别器优先级控制
- 实现
UIGestureRecognizerDelegate协议,调整折线图与TableView的手势识别优先级:
extension YourViewController: UIGestureRecognizerDelegate { func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { // 让TableView的滚动手势在折线图的拖动手势失败后再触发 return gestureRecognizer.view is LineChartView && otherGestureRecognizer.view is UITableView } }
- 给折线图的拖动手势设置代理:
override func viewDidLoad() { super.viewDidLoad() // 找到折线图的拖动手势 if let panGesture = lineChartView.gestureRecognizers?.first(where: { $0 is UIPanGestureRecognizer }) { panGesture.delegate = self } }
方案二:动态控制TableView的滚动状态
监听折线图的拖动状态,在拖动开始时禁用TableView滚动,结束时恢复:
override func viewDidLoad() { super.viewDidLoad() // 添加手势监听折线图拖动 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handleChartPan(_:))) // 允许折线图本身的手势和我们添加的手势同时工作 panGesture.cancelsTouchesInView = false lineChartView.addGestureRecognizer(panGesture) } @objc private func handleChartPan(_ gesture: UIPanGestureRecognizer) { switch gesture.state { case .began, .changed: tableView.isScrollEnabled = false case .ended, .cancelled, .failed: tableView.isScrollEnabled = true default: break } }
如果使用的是Charts库,也可以直接利用库的回调:
extension YourViewController: ChartViewDelegate { func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat) { // 当折线图发生拖动时,禁用TableView滚动 tableView.isScrollEnabled = false } func chartDragEnded(_ chartView: ChartViewBase, withGestureState state: UIGestureRecognizer.State) { // 拖动结束后恢复TableView滚动 if state == .ended || state == .cancelled { tableView.isScrollEnabled = true } } }
方案三:自定义TableView重写触摸方法
创建自定义TableView,拦截触摸事件,当触摸在折线图上时不取消触摸传递:
class CustomTableView: UITableView { override func touchesShouldCancel(in view: UIView) -> Bool { // 如果触摸的是折线图,不取消触摸,让折线图处理拖动 if view is LineChartView { return false } return super.touchesShouldCancel(in: view) } }
之后将Storyboard或代码中的TableView替换为这个自定义类即可。
内容的提问来源于stack exchange,提问作者yusuf demirkoparan
相关产品推荐
相关产品推荐

