(ios-charts) Не удалось отобразить линейный график в UICollectionView без использования раскадровки - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу добавить линейную диаграмму в ячейку UICollectionView, используя самостоятельно созданный класс BaseLineChartView, который наследуется от LineChartView в API диаграмм iOS.Я должен показать различные виды линейных графиков с одной и несколькими строками.Таким образом, этот подкласс используется для получения данных и настройки chartView.После запуска приложения в ячейке отображается только диаграмма со значением по умолчанию noDataText.Диаграмма не отображается, и изменения, которые я внес в noDataText, также не работают.Но предложение в последней строке функции setChart было выполнено и напечатано в консоли.

Вот код класса:

import UIKit
import Charts

class BaseLineChartView: LineChartView {

    let chartView = LineChartView()
    var months = [String]()
    var unitsSold = [Double]()

    override init(frame: CGRect) {
        super.init(frame: frame)
        populateData()
        lineChartSetup()
        setChart(dataPoints: months, values: unitsSold)
    }

    func populateData(){
        let _months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
        let _unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0]
        months = _months
        unitsSold = _unitsSold
    }

    func lineChartSetup() {
        // MARK: General
        chartView.noDataText = "No Data" //Doesn't work..
        chartView.chartDescription?.enabled = true
        chartView.dragEnabled = false
        chartView.setScaleEnabled(false)
        chartView.pinchZoomEnabled = false
        chartView.highlightPerDragEnabled = true
        chartView.backgroundColor = .lightGray

        chartView.dragXEnabled = true
        chartView.dragYEnabled = false

        // MARK: xAxis
        let xAxis = chartView.xAxis
        xAxis.labelPosition = .bottom
        xAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
        xAxis.labelTextColor = UIColor(red: 255/255, green: 192/255, blue: 56/255, alpha: 1)
        xAxis.axisLineColor = UIColor.lightGray
        xAxis.drawAxisLineEnabled = true
        xAxis.drawGridLinesEnabled = false
        xAxis.centerAxisLabelsEnabled = false
        xAxis.granularity = 1
        xAxis.labelRotationAngle = -90.0

        // MARK: leftAxis
        let leftAxis = chartView.leftAxis
        leftAxis.labelPosition = .outsideChart
        leftAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
        leftAxis.drawGridLinesEnabled = false
        leftAxis.granularityEnabled = true
        leftAxis.labelTextColor = UIColor(red: 255/255, green: 192/255, blue: 56/255, alpha: 1)

        // MARK: rightAxis
        chartView.rightAxis.enabled = false

        // MARK: legend
        chartView.legend.enabled = false

        // MARK: animation
        chartView.animate(xAxisDuration: 1.5)
    }


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

        var dataEntries: [ChartDataEntry] = []

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

        let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Units Sold")
        lineChartDataSet.mode = .cubicBezier
        let lineChartData = LineChartData(dataSet: lineChartDataSet)
        chartView.data = lineChartData

        chartView.scaleXEnabled = true
        chartView.scaleYEnabled = false
        chartView.setVisibleXRangeMaximum(10.0)
        chartView.xAxis.setLabelCount(11, force: false)

        print("Create Chart Successfully!") //Successfully show in console.
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

И я добавляю этот класс в ячейку collectionView следующим образом:

class DailyIndexCell: UICollectionViewCell {

    let trackingChart: BaseLineChartView = {
        let chartView = BaseLineChartView()
        return chartView
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        addSubview(trackingChart)
        trackingChart.notifyDataSetChanged() //Doesn't work
        self.setNeedsDisplay() //Doesn't work
        setConstraints()
    }

    func setConstraints() {
        //Add constraints of trackingChart

    }


}

Я пробовал решение вэтот пост, но не работает = '( Графики не отображаются в таблице ViewCell

1 Ответ

0 голосов
/ 25 декабря 2018

Похоже, вы создали свойство chartView в классе BaseLineChartView и задали различные параметры для этого свойства, но не используете его.Поэтому для решения вашей проблемы удалите свойство chartView из BaseLineChartView и замените все его вхождения на self (или просто удалите).Также обратите внимание на строки let xAxis = chartView.xAxis и let leftAxis = chartView.leftAxis, которые вам не нужны.

import UIKit Графики импорта

class BaseLineChartView: LineChartView {

    var months = [String]()
    var unitsSold = [Double]()

    override init(frame: CGRect) {
        super.init(frame: frame)
        populateData()
        lineChartSetup()
        setChart(dataPoints: months, values: unitsSold)
    }

    func populateData(){
        let _months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
        let _unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0]
        months = _months
        unitsSold = _unitsSold
    }

    func lineChartSetup() {
        // MARK: General
        noDataText = "No Data" //Doesn't work..
        chartDescription?.enabled = true
        dragEnabled = false
        setScaleEnabled(false)
        pinchZoomEnabled = false
        highlightPerDragEnabled = true
        backgroundColor = .lightGray

        dragXEnabled = true
        dragYEnabled = false

        // MARK: xAxis
        xAxis.labelPosition = .bottom
        xAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
        xAxis.labelTextColor = UIColor(red: 255/255, green: 192/255, blue: 56/255, alpha: 1)
        xAxis.axisLineColor = UIColor.lightGray
        xAxis.drawAxisLineEnabled = true
        xAxis.drawGridLinesEnabled = false
        xAxis.centerAxisLabelsEnabled = false
        xAxis.granularity = 1
        xAxis.labelRotationAngle = -90.0

        // MARK: leftAxis
        leftAxis.labelPosition = .outsideChart
        leftAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
        leftAxis.drawGridLinesEnabled = false
        leftAxis.granularityEnabled = true
        leftAxis.labelTextColor = UIColor(red: 255/255, green: 192/255, blue: 56/255, alpha: 1)

        // MARK: rightAxis
        rightAxis.enabled = false

        // MARK: legend
        legend.enabled = false

        // MARK: animation
        animate(xAxisDuration: 1.5)
    }


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

        var dataEntries: [ChartDataEntry] = []

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

        let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Units Sold")
        lineChartDataSet.mode = .cubicBezier
        let lineChartData = LineChartData(dataSet: lineChartDataSet)
        data = lineChartData

        scaleXEnabled = true
        scaleYEnabled = false
        setVisibleXRangeMaximum(10.0)
        xAxis.setLabelCount(11, force: false)

        print("Create Chart Successfully!") //Successfully show in console.
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
...