【问题标题】:Creating custom iOS-Charts renderer创建自定义 iOS 图表渲染器
【发布时间】:2017-05-16 11:28:20
【问题描述】:

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

所以我创建了我的自定义渲染器,但由于访问控制以及我使用的是 Cocoapods,我不得不重写 drawDataSet

  • 文件私有类缓冲区
  • fileprivate var _buffers = 缓冲区
  • fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int)
  • fileprivate var _barShadowRectBuffer: CGRect = CGRect() 打开覆盖
  • 打开覆盖函数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)

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

【问题讨论】:

    标签: ios swift ios-charts


    【解决方案1】:

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

    【讨论】:

    • 嗨,请问您如何覆盖drawValues?...我正在尝试为PieChartRenderer做同样的事情,但我真的不知道从哪里开始...谢谢!
    • 在我的渲染器子类中,我只是把默认drawValues()的副本放在我的需要上。
    • 你能访问 shouldDrawValues 吗?
    【解决方案2】:

    我如何使它适用于条形图:

    您的自定义渲染器:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2017-06-09
      • 2020-06-11
      相关资源
      最近更新 更多