使用Danielgindi/Charts获取可视区域中点最近数据点异常排查
获取Charts可视区域中点最近数据点时返回错误点的解决办法
问题场景
有开发者在使用Daniel Gindi的Charts库实现图表功能时,想要在用户滚动图表后,获取可视区域中点对应的最近数据点,编写了如下代码:
let currentMinX = self.chartView.lowestVisibleX let currentMaxX = self.chartView.highestVisibleX let midX = currentMinX + (currentMaxX - currentMinX)/2 let currentMinY = self.chartView.chartYMin // y轴不可滚动,因此可直接使用 let currentMaxY = self.chartView.chartYMax let midY = currentMinY + (currentMaxY - currentMinY)/2 let midPoint = CGPoint(x: midX, y: midY) let closestPoint = chartView.getHighlightByTouchPoint(midPoint) print("\(closestPoint?.x ?? 0)-\(closestPoint?.y ?? 0)")
但实际运行后,返回的closestPoint却是靠近可视区域左下角的点,并非中点附近的数据点。
问题根源
经过详细调试排查,发现问题出在Charts库内部的Transformer组件上:其valueForTouchPoint方法通过pixelToValueMatrix进行坐标转换时出现了错误,导致传入的中点坐标被错误映射,最终查找的是错误位置附近的数据点。
修复方案
修改Transformer的valueForTouchPoint方法,跳过错误的矩阵转换步骤,直接返回传入的坐标值即可解决问题:
@objc open func valueForTouchPoint(x: CGFloat, y: CGFloat) -> CGPoint { return CGPoint(x: x, y: y) // 注释掉原本有问题的转换代码: // return CGPoint(x: x, y: y).applying(pixelToValueMatrix) }
修改后,getHighlightByTouchPoint方法会基于正确的中点坐标去匹配最近的数据点,就能得到预期的结果。
内容的提问来源于stack exchange,提问作者izik461
相关产品推荐
相关产品推荐

