CubicLineChartViewController.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. //
  2. // CubicLineChartViewController.swift
  3. // ChartsDemo-iOS
  4. //
  5. // Created by Jacob Christie on 2017-07-09.
  6. // Copyright © 2017 jc. All rights reserved.
  7. //
  8. #if canImport(UIKit)
  9. import UIKit
  10. #endif
  11. import DGCharts
  12. private class CubicLineSampleFillFormatter: FillFormatter {
  13. func getFillLinePosition(dataSet: LineChartDataSetProtocol, dataProvider: LineChartDataProvider) -> CGFloat {
  14. return -10
  15. }
  16. }
  17. class CubicLineChartViewController: DemoBaseViewController {
  18. @IBOutlet var chartView: LineChartView!
  19. @IBOutlet var sliderX: UISlider!
  20. @IBOutlet var sliderY: UISlider!
  21. @IBOutlet var sliderTextX: UITextField!
  22. @IBOutlet var sliderTextY: UITextField!
  23. override func viewDidLoad() {
  24. super.viewDidLoad()
  25. // Do any additional setup after loading the view.
  26. self.title = "Cubic Line Chart"
  27. self.options = [.toggleValues,
  28. .toggleFilled,
  29. .toggleCircles,
  30. .toggleCubic,
  31. .toggleHorizontalCubic,
  32. .toggleStepped,
  33. .toggleHighlight,
  34. .animateX,
  35. .animateY,
  36. .animateXY,
  37. .saveToGallery,
  38. .togglePinchZoom,
  39. .toggleAutoScaleMinMax,
  40. .toggleData]
  41. chartView.delegate = self
  42. chartView.setViewPortOffsets(left: 0, top: 20, right: 0, bottom: 0)
  43. chartView.backgroundColor = UIColor(red: 104/255, green: 241/255, blue: 175/255, alpha: 1)
  44. chartView.dragEnabled = true
  45. chartView.setScaleEnabled(true)
  46. chartView.pinchZoomEnabled = false
  47. chartView.maxHighlightDistance = 300
  48. chartView.xAxis.enabled = false
  49. let yAxis = chartView.leftAxis
  50. yAxis.labelFont = UIFont(name: "HelveticaNeue-Light", size:12)!
  51. yAxis.setLabelCount(6, force: false)
  52. yAxis.labelTextColor = .white
  53. yAxis.labelPosition = .insideChart
  54. yAxis.axisLineColor = .white
  55. chartView.rightAxis.enabled = false
  56. chartView.legend.enabled = false
  57. sliderX.value = 45
  58. sliderY.value = 100
  59. self.slidersValueChanged(nil)
  60. chartView.animate(xAxisDuration: 2, yAxisDuration: 2)
  61. }
  62. override func updateChartData() {
  63. if self.shouldHideData {
  64. chartView.data = nil
  65. return
  66. }
  67. self.setDataCount(Int(sliderX.value + 1), range: UInt32(sliderY.value))
  68. }
  69. func setDataCount(_ count: Int, range: UInt32) {
  70. let yVals1 = (0..<count).map { (i) -> ChartDataEntry in
  71. let mult = range + 1
  72. let val = Double(arc4random_uniform(mult) + 20)
  73. return ChartDataEntry(x: Double(i), y: val)
  74. }
  75. let set1 = LineChartDataSet(entries: yVals1, label: "DataSet 1")
  76. set1.mode = .cubicBezier
  77. set1.drawCirclesEnabled = false
  78. set1.lineWidth = 1.8
  79. set1.circleRadius = 4
  80. set1.setCircleColor(.white)
  81. set1.highlightColor = UIColor(red: 244/255, green: 117/255, blue: 117/255, alpha: 1)
  82. set1.fillColor = .white
  83. set1.fillAlpha = 1
  84. set1.drawHorizontalHighlightIndicatorEnabled = false
  85. set1.fillFormatter = CubicLineSampleFillFormatter()
  86. let data = LineChartData(dataSet: set1)
  87. data.setValueFont(UIFont(name: "HelveticaNeue-Light", size: 9)!)
  88. data.setDrawValues(false)
  89. chartView.data = data
  90. }
  91. override func optionTapped(_ option: Option) {
  92. guard let data = chartView.data else { return }
  93. switch option {
  94. case .toggleFilled:
  95. for case let set as LineChartDataSet in data {
  96. set.drawFilledEnabled = !set.drawFilledEnabled
  97. }
  98. chartView.setNeedsDisplay()
  99. case .toggleCircles:
  100. for case let set as LineChartDataSet in data {
  101. set.drawCirclesEnabled = !set.drawCirclesEnabled
  102. }
  103. chartView.setNeedsDisplay()
  104. case .toggleCubic:
  105. for case let set as LineChartDataSet in data {
  106. set.mode = (set.mode == .cubicBezier) ? .linear : .cubicBezier
  107. }
  108. chartView.setNeedsDisplay()
  109. case .toggleStepped:
  110. for case let set as LineChartDataSet in data {
  111. set.mode = (set.mode == .stepped) ? .linear : .stepped
  112. }
  113. chartView.setNeedsDisplay()
  114. case .toggleHorizontalCubic:
  115. for case let set as LineChartDataSet in data {
  116. set.mode = (set.mode == .cubicBezier) ? .horizontalBezier : .cubicBezier
  117. }
  118. chartView.setNeedsDisplay()
  119. default:
  120. super.handleOption(option, forChartView: chartView)
  121. }
  122. }
  123. // MARK: - Actions
  124. @IBAction func slidersValueChanged(_ sender: Any?) {
  125. sliderTextX.text = "\(Int(sliderX.value))"
  126. sliderTextY.text = "\(Int(sliderY.value))"
  127. self.updateChartData()
  128. }
  129. }