我正在使用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)
一切正常。我错过了什么吗?
答案 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()