创建自定义iOS图表渲染器

时间:2017-05-16 11:28:20

标签: ios swift ios-charts

我正在使用iOS-Charts library,我需要继承HorizontalBarChartRenderer,以便我可以更改drawDataSet(...)的实现。如前所述,这应该是可能的,例如this answer

所以我创建了自定义渲染器,但由于访问控制而且因为我使用Cocoapods,我不得不覆盖drawDataSet以外的内容:

  • fileprivate class Buffer
  • fileprivate var _buffers = Buffer
  • fileprivate func prepareBuffer(dataSet:IBarChartDataSet,index:Int)
  • fileprivate var _barShadowRectBuffer:CGRect = CGRect()open override
  • open override func drawDataSet(context:CGContext,dataSet:IBarChartDataSet, index:Int)

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

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

当我尝试运行它时,我fatal error: Index out of rangeBarCharRenderer's drawValues()

let buffer = _buffers[dataSetIndex]

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

self.horizontalBarView.renderer = HorizontalBarChartRenderer(dataProvider: self.horizontalBarView, animator: self.horizontalBarView.chartAnimator, viewPortHandler: self.horizontalBarView.viewPortHandler)
一切正常。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

我终于知道问题是什么,我的子类没有覆盖drawValues()方法,因为它并不是明确需要的。此外,该方法访问内部的变量shouldDrawValues,因此无法在模块外部访问。我已经注释了它现在使用的部分,但我必须以某种方式模仿我自己。

答案 1 :(得分:3)

我如何使其适用于条形图:

您的自定义渲染器:

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()