我正在使用iOS-Charts library,我需要继承HorizontalBarChartRenderer
,以便我可以更改drawDataSet(...)
的实现。如前所述,这应该是可能的,就像在this answer中一样。
所以我创建了我的自定义渲染器,但由于访问控制而且因为我正在使用Cocoapods,我不得不覆盖drawDataSet
:
我没有改变任何东西,上面的方法只是从HorizontalBarChartRenderer
复制,我设置这样的渲染器:
self.horizontalBarView.renderer = HorizontalBarStackRenderer(dataProvider: self.horizontalBarView, animator: self.horizontalBarView.chartAnimator, viewPortHandler: self.horizontalBarView.viewPortHandler).
当我尝试运行它时,我在fatal error: Index out of range
获得BarCharRenderer's drawValues()
:
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()