Horizo​​ntalBarChart 值突出显示

HorizontalBarChart Value Highlighting

我目前正在使用 Charts cocoapod,但我不知道如何实现以下功能:从 HorizontalBarChartDatSet 选择 DataEntry 时,我想通过更改来突出显示它栏的borderColor。这对于当前版本的 pod 是否可行?如果不行,您能否至少给我一些关于在哪里查看以覆盖此功能的信息?

目前我可以像这样突出显示 DataEntry

dataSet.highlightColor = UIColor.lightGray
dataSet.highlightAlpha = 1

但是,我只想在选定的周围制作边框 DataEntry 而不是更改其颜色。

我已经为一些特定功能覆盖了库,但似乎无法弄清楚这一点。

提前致谢!

据我所知,当前版本的图表库没有选定栏周围的突出显示边框的属性。但是您可以从 BarChartRenderer class 继承您自己的 class,覆盖函数 drawHighlighted(context: indices:) 并使用新渲染器 class 的实例作为图表的自定义渲染器。

自定义渲染器 class:

class MyBarChartRenderer: BarChartRenderer {

    // New properties for the border
    var highlightBorderColor: UIColor = .red
    var highlightBorderWidth: CGFloat = 2

    open override func drawHighlighted(context: CGContext, indices: [Highlight])
    {
        guard
            let dataProvider = dataProvider,
            let barData = dataProvider.barData
            else { return }

        context.saveGState()

        var barRect = CGRect()

        for high in indices
        {
            guard
                let set = barData.getDataSetByIndex(high.dataSetIndex) as? IBarChartDataSet,
                set.isHighlightEnabled
                else { continue }

            if let e = set.entryForXValue(high.x, closestToY: high.y) as? BarChartDataEntry
            {
                let trans = dataProvider.getTransformer(forAxis: set.axisDependency)

                // Setting color and width for the border
                context.setStrokeColor(highlightBorderColor.cgColor)
                context.setLineWidth(highlightBorderWidth)

                let isStack = high.stackIndex >= 0 && e.isStacked

                let y1: Double
                let y2: Double

                if isStack
                {
                    if dataProvider.isHighlightFullBarEnabled
                    {
                        y1 = e.positiveSum
                        y2 = -e.negativeSum
                    }
                    else
                    {
                        let range = e.ranges?[high.stackIndex]

                        y1 = range?.from ?? 0.0
                        y2 = range?.to ?? 0.0
                    }
                }
                else
                {
                    y1 = e.y
                    y2 = 0.0
                }

                prepareBarHighlight(x: e.x, y1: y1, y2: y2, barWidthHalf: barData.barWidth / 2.0, trans: trans, rect: &barRect)
                // Drawing the border
                context.stroke(barRect)
            }
        }

        context.restoreGState()
    }
}

使用新渲染器:

myBarChartView.renderer = MyBarChartRenderer(
    dataProvider: self.barChartView, 
    animator: self.barChartView.chartAnimator, 
    viewPortHandler: self.barChartView.viewPortHandler)

结果: