如何在Danielgindi Charts的LineChartView中修改选中DataSet的坐标轴高亮色
实现LineChartView垂直/水平高亮线分别设置颜色
Danielgindi Charts(原iOS-Charts)默认的highlightColor会同时控制垂直和水平高亮线条的颜色,要实现分别定制,我们可以通过子类化LineChartView并重写高亮绘制方法来实现。
步骤1:自定义LineChartView子类
创建一个自定义的LineChartView子类,添加两个属性分别存储垂直和水平高亮线的颜色,并重写drawHighlighted(_:)方法来分别绘制两条线条:
class CustomLineChartView: LineChartView { // 自定义垂直(Y轴)高亮线颜色 var verticalHighlightColor: UIColor = .blue // 自定义水平(X轴)高亮线颜色 var horizontalHighlightColor: UIColor = .red override func drawHighlighted(_ indices: [Highlight]) { guard let chartData = data else { return } for highlight in indices { guard let dataSet = chartData.getDataSetByIndex(highlight.dataSetIndex) as? LineChartDataSet, dataSet.isHighlightEnabled else { continue } guard let entry = dataSet.entryForXValue(highlight.x, closestToY: highlight.y, rounding: .closest) else { continue } // 转换坐标为视图坐标系 let convertedPoint = transformForValues(x: entry.x, y: entry.y) // 绘制垂直高亮线(Y轴方向) if dataSet.drawVerticalHighlightIndicatorEnabled { UIGraphicsGetCurrentContext()?.saveGState() defer { UIGraphicsGetCurrentContext()?.restoreGState() } let context = UIGraphicsGetCurrentContext()! context.setStrokeColor(verticalHighlightColor.cgColor) context.setLineWidth(dataSet.highlightLineWidth) // 保留原有的虚线样式设置 if let dashLengths = dataSet.highlightLineDashLengths { context.setLineDash(phase: 0, lengths: dashLengths) } else { context.setLineDash(phase: 0, lengths: []) } context.beginPath() context.move(to: CGPoint(x: convertedPoint.x, y: viewPortHandler.contentTop)) context.addLine(to: CGPoint(x: convertedPoint.x, y: viewPortHandler.contentBottom)) context.strokePath() } // 绘制水平高亮线(X轴方向) if dataSet.drawHorizontalHighlightIndicatorEnabled { UIGraphicsGetCurrentContext()?.saveGState() defer { UIGraphicsGetCurrentContext()?.restoreGState() } let context = UIGraphicsGetCurrentContext()! context.setStrokeColor(horizontalHighlightColor.cgColor) context.setLineWidth(dataSet.highlightLineWidth) // 保留原有的虚线样式设置 if let dashLengths = dataSet.highlightLineDashLengths { context.setLineDash(phase: 0, lengths: dashLengths) } else { context.setLineDash(phase: 0, lengths: []) } context.beginPath() context.move(to: CGPoint(x: viewPortHandler.contentLeft, y: convertedPoint.y)) context.addLine(to: CGPoint(x: viewPortHandler.contentRight, y: convertedPoint.y)) context.strokePath() } } } }
步骤2:替换原LineChartView并配置
将你界面中的LineChartView替换为CustomLineChartView,然后在代码中配置数据集和自定义颜色:
// 初始化数据集 let set1 = LineChartDataSet(entries: self.dataEntry, label: "chart") set1.drawCirclesEnabled = false set1.mode = .horizontalBezier // 确保开启垂直/水平高亮线绘制 set1.drawVerticalHighlightIndicatorEnabled = true set1.drawHorizontalHighlightIndicatorEnabled = true // 保留原有的虚线和线宽设置 set1.highlightLineDashLengths = [8.0, 4.0] set1.highlightLineWidth = 2.0 // 组装图表数据 let data = LineChartData(dataSet: set1) self.chartView.data = data // 设置自定义的高亮线颜色 self.chartView.verticalHighlightColor = UIColor.blue // Y轴垂直高亮线 self.chartView.horizontalHighlightColor = UIColor.red // X轴水平高亮线
说明
- 我们保留了原数据集的
highlightLineDashLengths和highlightLineWidth设置,确保虚线样式和线宽依然生效。 - 如果不需要某一条高亮线,只需要将对应的
drawVerticalHighlightIndicatorEnabled或drawHorizontalHighlightIndicatorEnabled设置为false即可。 - 重写
drawHighlighted(_:)方法时,我们自己处理了高亮线的绘制,这样就能完全控制两条线条的颜色了。
内容的提问来源于stack exchange,提问作者Vikash Sinha
相关产品推荐
相关产品推荐

