【问题标题】:IOS Charts using Swift X-Axis issuesIOS 图表使用 Swift X 轴问题
【发布时间】:2017-03-30 09:32:00
【问题描述】:

我最近升级到了最新版本的 IOS Charts 和 X-Code (8.3),但我遇到了 IOS Charts 和我的 x 轴的问题。我的 x 轴支持显示日期,但自从升级后我无法让它工作,我只得到 0 到 6。我相信我知道为什么,这是因为我似乎无法设置 X-轴值了。

这里是升级前的原代码:

func setChart(_ dataPoints: [String], values: [Double]) {

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(value: values[i], xIndex: i)
        dataEntries.append(dataEntry)
    }

    let lineChartDataSet = LineChartDataSet(yVals: dataEntries, label: "Total Items")
    let lineChartData = LineChartData(xVals: dataPoints, dataSet: lineChartDataSet)

    lineChartDataSet.colors = [UIColor(red: 27.0/255.0, green: 114.0/255.0, blue: 216.0/255.0, alpha: 1.0)]
    lineChartView.xAxis.labelPosition = .bottom
    lineChartView.xAxis.labelFont = UIFont(name: "AvenirNext-Medium", size: 8.0)!
    lineChartView.legend.enabled = false
    lineChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInOutQuad)
    lineChartView.chartDescription?.text = ""
    lineChartView.rightAxis.enabled = false
    lineChartView.leftAxis.labelFont = UIFont(name: "AvenirNext-Medium", size: 8.0)!
    lineChartDataSet.drawValuesEnabled = false
    lineChartDataSet.drawCirclesEnabled = false
    lineChartDataSet.lineWidth = 2.0
    lineChartView.leftAxis.valueFormatter = NumberFormatter()
    lineChartView.leftAxis.valueFormatter.minimumFractionDigits = 0
    lineChartView.isUserInteractionEnabled = false
    lineChartView.data = lineChartData

}

所以这总是工作正常,因为升级的东西已经改变了,所以我的代码现在是:

func setChart(_ dataPoints: [String], values: [Double]) {

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
    }

    let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Total Items")
    let lineChartData = LineChartData(dataSet: lineChartDataSet)

    lineChartDataSet.colors = [UIColor(red: 27.0/255.0, green: 114.0/255.0, blue: 216.0/255.0, alpha: 1.0)]
    lineChartView.xAxis.labelPosition = .bottom
    lineChartView.xAxis.labelFont = UIFont(name: "AvenirNext-Medium", size: 8.0)!
    lineChartView.legend.enabled = false
    lineChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInOutQuad)
    lineChartView.chartDescription?.text = ""
    lineChartView.rightAxis.enabled = false
    lineChartView.leftAxis.labelFont = UIFont(name: "AvenirNext-Medium", size: 8.0)!
    lineChartDataSet.drawValuesEnabled = false
    lineChartDataSet.drawCirclesEnabled = false
    lineChartDataSet.lineWidth = 2.0
    lineChartView.leftAxis.valueFormatter = NumberFormatter() as? IAxisValueFormatter
    //lineChartView.leftAxis.valueFormatter.minimumFractionDigits = 0
    lineChartView.isUserInteractionEnabled = false
    lineChartView.data = lineChartData

}

所以在我在 lineChartData 中设置 x 轴值之前,但现在我不能这样做,所以我认为我的 x 轴数据没有被设置。谁能帮忙让我的日期再次显示在我的 x 轴上?

谢谢

戴夫

【问题讨论】:

    标签: ios charts swift3 ios-charts


    【解决方案1】:

    您需要使用 stringForValue 方法实现 IAxisValueFormatter 协议并将其设置为 xAxis.valueFormatter 的委托

    我看到了两种方式。

    1. 您可以在 ViewController 中添加 IAxisValueFormatter 协议,并在您的 ViewController 中实现 stringForValue。

      class ViewController: UIViewController, IAxisValueFormatter {
      
          // your code ...
      
          // implement delegate method
          func stringForValue(_ dataPointIndex: Double, axis: AxisBase?) -> String {
      
              return someDataPoints[Int(dataPointIndex)]
          }
      
          func setChart(dataPoints: [String], values: [Double]){
              // your code ...
      
              // Set delegate 
              lineChartView.xAxis.valueFormatter = self
          }
      
          // your code ...
      }
      
    2. 或者您可以为 IAxisValueFormatter 协议创建特定的委托类。

      private class DataPointFormatter: NSObject, IAxisValueFormatter {
      
          var dataPoints: [String] = []
      
          func stringForValue(_ value: Double, axis: AxisBase?) -> String {
              return dataPoints[Int(value)]
          }
      
          init(dataPoints: [String]) {
              super.init()
              self.dataPoints = dataPoints
          }
      }
      

      然后在你的 setChart 函数中设置委托

      func setChart(dataPoints: [String], values: [Double]){
          // your code ...
      
          lineChartView.xAxis.valueFormatter = DataPointFormatter(dataPoints: dataPoints)
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多