You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:21:04