创建自定义 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
:
- 文件私有class缓冲区
- fileprivate var _buffers = 缓冲区
- fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int)
- fileprivate var _barShadowRectBuffer: CGRect = CGRect() 打开覆盖
- 打开覆盖 func drawDataSet(上下文:CGContext,数据集:IBarChartDataSet,
索引:整数)
我还没有做任何更改,上面的方法只是从 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()
我正在使用 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
:
- 文件私有class缓冲区
- fileprivate var _buffers = 缓冲区
- fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int)
- fileprivate var _barShadowRectBuffer: CGRect = CGRect() 打开覆盖
- 打开覆盖 func drawDataSet(上下文:CGContext,数据集:IBarChartDataSet, 索引:整数)
我还没有做任何更改,上面的方法只是从 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()