创建自定义iOS-Charts渲染器

问题描述 投票:2回答:2

我正在使用iOS-Charts library,我需要继承HorizontalBarChartRenderer,以便我可以更改drawDataSet(...)的实现。如前所述,这应该是可能的,就像在this answer中一样。

所以我创建了我的自定义渲染器,但由于访问控制而且因为我正在使用Cocoapods,我不得不覆盖drawDataSet

  • fileprivate类Buffer
  • fileprivate var _buffers = Buffer
  • fileprivate func prepareBuffer(dataSet:IBarChartDataSet,index:Int)
  • fileprivate var _barShadowRectBuffer:CGRect = CGRect()打开覆盖
  • open override func drawDataSet(context:CGContext,dataSet:IBarChartDataSet,index:Int)

我没有改变任何东西,上面的方法只是从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)

一切正常。我错过了什么吗?

ios swift ios-charts
2个回答
3
投票

我终于知道问题是什么,我的子类没有覆盖drawValues()方法,因为它不是明确的需要它。此外,该方法访问内部的变量shouldDrawValues,因此无法在模块外部访问。我已经注释掉了它现在使用的部分,但我必须以某种方式模仿我自己。


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()

© www.soinside.com 2019 - 2024. All rights reserved.