Я хочу добавить линейную диаграмму в ячейку 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