Charts Pod如何使用getPosition获取最后一条数据条目位置并正确添加UIImage
问题根源
你目前的代码存在两个核心错误导致位置偏移:
- 初始化
UIImageViewframe时语法错误,直接把point结构体同时传给了x和y参数,实际应该分别取point.x和point.y getPosition返回的坐标是数据点的中心点,你直接把这个坐标作为imageView的左上角原点,会导致图片整体向右下角偏移了自身宽高的一半
修复代码
首先确保获取坐标的逻辑放在图表渲染完成之后执行,比如放在设置完图表数据、调用notifyDataSetChanged()之后执行,避免图表未完成布局导致坐标计算错误:
if dataPoint.count > 0 { for i in 0..<dataPoint.count { let value = ChartDataEntry(x: Double(i), y: dataPoint[i].running) lineChartEntry.append(value) } } // 赋值图表数据后强制完成布局计算 lineChartView.data = LineChartData(dataSet: 你的折线数据集) lineChartView.layoutIfNeeded() guard let lastEntry = lineChartEntry.last else { return } let point = lineChartView.getPosition(entry: lastEntry, axis: .left) let imageSize = CGSize(width: 15, height: 15) // 调整坐标,让图片中心对齐数据点中心 let imageFrame = CGRect( x: point.x - imageSize.width / 2, y: point.y - imageSize.height / 2, width: imageSize.width, height: imageSize.height ) let imageView = UIImageView(image: UIImage(named: "heart")) imageView.frame = imageFrame lineChartView.addSubview(imageView)
备选实现方案
如果上述方法还是存在偏移,可以直接用图表自带的自定义渲染逻辑实现,不需要单独添加subview:
继承LineChartRenderer,重写drawValues方法,在最后一个数据点的位置直接绘制图片,这种方式的坐标计算完全和图表原生渲染逻辑一致,不会出现偏移问题。
内容的提问来源于stack exchange,提问作者14079_Z
相关产品推荐
相关产品推荐

