基于iOS Charts的触摸交互追踪及条目高亮实现咨询
当然可以实现这个触摸追踪高亮的效果!其实iOS Charts本身就提供了现成的机制来做这个,不用自己从零开始加手势——不过如果你偏好自定义手势的方案,我也会给你详细说明怎么实现。
方法一:利用Charts内置的交互功能(最简单)
这是最省心的方案,直接配置图表的交互属性就能实现:
- 首先禁用图表的平移、缩放等不需要的交互,避免触摸时触发默认的平移操作:
chartView.dragEnabled = false chartView.scaleEnabled = false chartView.pinchZoomEnabled = false - 开启拖拽时的高亮功能,这样手指移动时会自动追踪并高亮对应条目:
chartView.highlightPerDragEnabled = true // 如果需要点击也能高亮,可以加上这个 chartView.highlightPerTapEnabled = true - (可选)自定义高亮样式:如果默认的高亮线、颜色不符合你的需求,可以调整这些属性:
要是需要显示更复杂的高亮提示(比如数值标签),还可以自定义chartView.highlightColor = .red chartView.highlightLineWidth = 2.0 chartView.drawVerticalHighlightIndicatorEnabled = true // 显示垂直高亮线 chartView.drawHorizontalHighlightIndicatorEnabled = false // 隐藏水平高亮线(按需设置)MarkerView并赋值给chartView.marker。
方法二:自定义UIGestureRecognizer实现(按需选择)
如果你一定要自己通过手势来控制,也完全可行,关键是用Charts提供的API获取触摸点对应的条目:
- 给图表添加手势,注意要关闭手势的
cancelsTouchesInView,避免和图表本身的手势冲突:let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:))) panGesture.cancelsTouchesInView = false chartView.addGestureRecognizer(panGesture) - 在手势处理方法中,获取触摸点并查询对应的高亮信息:
@objc private func handlePan(_ gesture: UIPanGestureRecognizer) { let touchPoint = gesture.location(in: chartView) // 调用Charts的API获取触摸点对应的Highlight对象 guard let highlight = chartView.getHighlightByTouchPoint(touchPoint) else { chartView.highlightValue(nil) return } switch gesture.state { case .began, .changed: // 高亮对应条目 chartView.highlightValue(highlight) case .ended, .cancelled: // 手势结束后取消高亮 chartView.highlightValue(nil) default: break } } - 别忘了确保你的数据集允许高亮:每个
ChartDataSet都要设置isHighlightEnabled = true(默认是true,但如果之前改过的话要检查)。
最后提醒:两种方法都能实现你要的效果,推荐第一种内置方案,因为它已经处理了很多边缘情况(比如触摸点在图表范围外的处理、多数据集的高亮逻辑等),不用自己额外处理。
内容的提问来源于stack exchange,提问作者Jack Guo
相关产品推荐
相关产品推荐

