创建自定义iOS图表渲染器
我正在使用,我需要对创建自定义iOS图表渲染器,ios,swift,ios-charts,Ios,Swift,Ios Charts,我正在使用,我需要对HorizontalBarChartRenderer进行子类化,以便可以更改drawDataSet(…)的实现。如前所述,这应该是可能的,如中所述 所以我创建了我的自定义渲染器,但由于访问控制和使用Cocoapods,我不得不覆盖的不仅仅是drawDataSet: fileprivate类缓冲区 fileprivate var\u buffers=缓冲区 fileprivate func prepareBuffer(数据集:IBarChartDataSet,索引:Int)
HorizontalBarChartRenderer
进行子类化,以便可以更改drawDataSet(…)
的实现。如前所述,这应该是可能的,如中所述
所以我创建了我的自定义渲染器,但由于访问控制和使用Cocoapods,我不得不覆盖的不仅仅是drawDataSet
:
- fileprivate类缓冲区
- fileprivate var\u buffers=缓冲区
- fileprivate func prepareBuffer(数据集:IBarChartDataSet,索引:Int)
- fileprivate var\u barShadowRectBuffer:cgrit=cgrit()打开覆盖
- 打开覆盖func drawDataSet(上下文:CGContext,数据集:IBarChartDataSet, 索引:Int)
HorizontalBarChartRenderer
复制的,我将渲染器设置为:
self.horizontalBarView.renderer = HorizontalBarStackRenderer(dataProvider: self.horizontalBarView, animator: self.horizontalBarView.chartAnimator, viewPortHandler: self.horizontalBarView.viewPortHandler).
当我尝试运行它时,在BarCharRenderer的drawValues()
处出现致命错误:索引超出范围
:
当我尝试以相同的方式将渲染器设置为标准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\u NAME()
嗨,我能问一下您是如何覆盖drawValues
?…我正在尝试对PieChartRenderer
执行相同的操作,但我真的不知道从哪里开始..谢谢!在我的renderer子类中,我只放置了defaultdrawValues()
的副本,并根据我的需要对其进行了调整。您能够访问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 */ }
}