创建自定义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子类中,我只放置了default
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 */ }
}