创建自定义 iOS-Charts 渲染器

Creating custom iOS-Charts renderer

我正在使用 iOS-Charts library, and I need to subclass HorizontalBarChartRenderer so that I can change implementation of drawDataSet(...). This should be possible as stated before, like in this answer

所以我创建了我的自定义渲染器,但是由于访问控制以及我使用的是 Cocoapods,我不得不覆盖的不仅仅是 drawDataSet:

我还没有做任何更改,上面的方法只是从 HorizontalBarChartRenderer 复制而来,我这样设置渲染器:

self.horizontalBarView.renderer = HorizontalBarStackRenderer(dataProvider: self.horizontalBarView, animator: self.horizontalBarView.chartAnimator, viewPortHandler: self.horizontalBarView.viewPortHandler).

当我尝试 运行 它时,我在 BarCharRenderer's drawValues():

得到 fatal error: Index out of range
let buffer = _buffers[dataSetIndex]

当我尝试以同样的方式将渲染器设置为标准 HorizontalBarChartRenderer 时:

self.horizontalBarView.renderer = HorizontalBarChartRenderer(dataProvider: self.horizontalBarView, animator: self.horizontalBarView.chartAnimator, viewPortHandler: self.horizontalBarView.viewPortHandler)

一切正常。我错过了什么吗?

我终于知道问题出在哪里了,我的子类没有重写 drawValues() 方法,因为没有明确指出需要它。此外,此方法正在访问内部变量 shouldDrawValues ,因此无法在模块外部访问。我注释掉了它现在使用的部分,但我将不得不以某种方式自己模仿它。

我如何让它适用于条形图:

您的自定义渲染器:

class RoundedBarChartRenderer: BarChartRenderer {

    private class Buffer {
       var rects = [CGRect]()
    }

    private var _buffers = [Buffer]()

    private var _barShadowRectBuffer: CGRect = CGRect()

    override func initBuffers() { /* copy everything from original file */ }

    override func drawDataSet(context: CGContext, dataSet: IBarChartDataSet, index: Int)
        { /* Copy everything */ }

    private func prepareBuffer(dataSet: IBarChartDataSet, index: Int)  { /* copy everything */ }

    override func drawValues(context: CGContext) { /* Copy everything */ }
}

某些部分仍然无法正常工作,例如辅助功能。注释掉那些部分。另外,不要使用任何 super.METHOD_NAME()