Horizo​​ntalBarChart值突出显示

时间:2017-12-01 14:45:39

标签: ios swift ios-charts

我目前正在使用Charts cocoapod而我无法弄清楚如何实现以下功能:从DataEntry选择HorizontalBarChartDatSet时,我想通过更改{来突出显示它酒吧的{1}}。这是否可以使用当前版本的pod,如果没有,您能否至少给我一些关于在哪里查看以覆盖此功能的信息?

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

DataEntry

但是,我想只围绕选定的dataSet.highlightColor = UIColor.lightGray dataSet.highlightAlpha = 1 制作边框而不改变其颜色。

我已经覆盖了几个特定功能的库,但似乎无法弄清楚这个。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

自定义渲染器类:

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)

结果:

enter image description here