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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:52:45