LineChart1ViewController.swift 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. //
  2. // LineChart1ViewController.swift
  3. // ChartsDemo-iOS
  4. //
  5. // Created by Jacob Christie on 2017-07-09.
  6. // Copyright © 2017 jc. All rights reserved.
  7. //
  8. import UIKit
  9. import DGCharts
  10. class LineChart1ViewController: DemoBaseViewController {
  11. @IBOutlet var chartView: LineChartView!
  12. @IBOutlet var sliderX: UISlider!
  13. @IBOutlet var sliderY: UISlider!
  14. @IBOutlet var sliderTextX: UITextField!
  15. @IBOutlet var sliderTextY: UITextField!
  16. override func viewDidLoad() {
  17. super.viewDidLoad()
  18. // Do any additional setup after loading the view.
  19. self.title = "Line Chart 1"
  20. self.options = [.toggleValues,
  21. .toggleFilled,
  22. .toggleCircles,
  23. .toggleCubic,
  24. .toggleHorizontalCubic,
  25. .toggleIcons,
  26. .toggleStepped,
  27. .toggleHighlight,
  28. .toggleGradientLine,
  29. .animateX,
  30. .animateY,
  31. .animateXY,
  32. .saveToGallery,
  33. .togglePinchZoom,
  34. .toggleAutoScaleMinMax,
  35. .toggleData]
  36. chartView.delegate = self
  37. chartView.chartDescription.enabled = false
  38. chartView.dragEnabled = true
  39. chartView.setScaleEnabled(true)
  40. chartView.pinchZoomEnabled = true
  41. // x-axis limit line
  42. let llXAxis = ChartLimitLine(limit: 10, label: "Index 10")
  43. llXAxis.lineWidth = 4
  44. llXAxis.lineDashLengths = [10, 10, 0]
  45. llXAxis.labelPosition = .rightBottom
  46. llXAxis.valueFont = .systemFont(ofSize: 10)
  47. chartView.xAxis.gridLineDashLengths = [10, 10]
  48. chartView.xAxis.gridLineDashPhase = 0
  49. let ll1 = ChartLimitLine(limit: 150, label: "Upper Limit")
  50. ll1.lineWidth = 4
  51. ll1.lineDashLengths = [5, 5]
  52. ll1.labelPosition = .rightTop
  53. ll1.valueFont = .systemFont(ofSize: 10)
  54. let ll2 = ChartLimitLine(limit: -30, label: "Lower Limit")
  55. ll2.lineWidth = 4
  56. ll2.lineDashLengths = [5,5]
  57. ll2.labelPosition = .rightBottom
  58. ll2.valueFont = .systemFont(ofSize: 10)
  59. let leftAxis = chartView.leftAxis
  60. leftAxis.removeAllLimitLines()
  61. leftAxis.addLimitLine(ll1)
  62. leftAxis.addLimitLine(ll2)
  63. leftAxis.axisMaximum = 200
  64. leftAxis.axisMinimum = -50
  65. leftAxis.gridLineDashLengths = [5, 5]
  66. leftAxis.drawLimitLinesBehindDataEnabled = true
  67. chartView.rightAxis.enabled = false
  68. //[_chartView.viewPortHandler setMaximumScaleY: 2.f];
  69. //[_chartView.viewPortHandler setMaximumScaleX: 2.f];
  70. let marker = BalloonMarker(color: UIColor(white: 180/255, alpha: 1),
  71. font: .systemFont(ofSize: 12),
  72. textColor: .white,
  73. insets: UIEdgeInsets(top: 8, left: 8, bottom: 20, right: 8))
  74. marker.chartView = chartView
  75. marker.minimumSize = CGSize(width: 80, height: 40)
  76. chartView.marker = marker
  77. chartView.legend.form = .line
  78. sliderX.value = 45
  79. sliderY.value = 100
  80. slidersValueChanged(nil)
  81. chartView.animate(xAxisDuration: 2.5)
  82. }
  83. override func updateChartData() {
  84. if self.shouldHideData {
  85. chartView.data = nil
  86. return
  87. }
  88. self.setDataCount(Int(sliderX.value), range: UInt32(sliderY.value))
  89. }
  90. func setDataCount(_ count: Int, range: UInt32) {
  91. let values = (0..<count).map { (i) -> ChartDataEntry in
  92. let val = Double(arc4random_uniform(range) + 3)
  93. return ChartDataEntry(x: Double(i), y: val, icon: #imageLiteral(resourceName: "icon"))
  94. }
  95. let set1 = LineChartDataSet(entries: values, label: "DataSet 1")
  96. set1.drawIconsEnabled = false
  97. setup(set1)
  98. let value = ChartDataEntry(x: Double(3), y: 3)
  99. set1.addEntryOrdered(value)
  100. let gradientColors = [ChartColorTemplates.colorFromString("#00ff0000").cgColor,
  101. ChartColorTemplates.colorFromString("#ffff0000").cgColor]
  102. let gradient = CGGradient(colorsSpace: nil, colors: gradientColors as CFArray, locations: nil)!
  103. set1.fillAlpha = 1
  104. set1.fill = LinearGradientFill(gradient: gradient, angle: 90)
  105. set1.drawFilledEnabled = true
  106. let data = LineChartData(dataSet: set1)
  107. chartView.data = data
  108. }
  109. private func setup(_ dataSet: LineChartDataSet) {
  110. if dataSet.isDrawLineWithGradientEnabled {
  111. dataSet.lineDashLengths = nil
  112. dataSet.highlightLineDashLengths = nil
  113. dataSet.setColors(.black, .red, .white)
  114. dataSet.setCircleColor(.black)
  115. dataSet.gradientPositions = [0, 40, 100]
  116. dataSet.lineWidth = 1
  117. dataSet.circleRadius = 3
  118. dataSet.drawCircleHoleEnabled = false
  119. dataSet.valueFont = .systemFont(ofSize: 9)
  120. dataSet.formLineDashLengths = nil
  121. dataSet.formLineWidth = 1
  122. dataSet.formSize = 15
  123. } else {
  124. dataSet.lineDashLengths = [5, 2.5]
  125. dataSet.highlightLineDashLengths = [5, 2.5]
  126. dataSet.setColor(.black)
  127. dataSet.setCircleColor(.black)
  128. dataSet.gradientPositions = nil
  129. dataSet.lineWidth = 1
  130. dataSet.circleRadius = 3
  131. dataSet.drawCircleHoleEnabled = false
  132. dataSet.valueFont = .systemFont(ofSize: 9)
  133. dataSet.formLineDashLengths = [5, 2.5]
  134. dataSet.formLineWidth = 1
  135. dataSet.formSize = 15
  136. }
  137. }
  138. override func optionTapped(_ option: Option) {
  139. guard let data = chartView.data else { return }
  140. switch option {
  141. case .toggleFilled:
  142. for case let set as LineChartDataSet in data {
  143. set.drawFilledEnabled = !set.drawFilledEnabled
  144. }
  145. chartView.setNeedsDisplay()
  146. case .toggleCircles:
  147. for case let set as LineChartDataSet in data {
  148. set.drawCirclesEnabled = !set.drawCirclesEnabled
  149. }
  150. chartView.setNeedsDisplay()
  151. case .toggleCubic:
  152. for case let set as LineChartDataSet in data {
  153. set.mode = (set.mode == .cubicBezier) ? .linear : .cubicBezier
  154. }
  155. chartView.setNeedsDisplay()
  156. case .toggleStepped:
  157. for case let set as LineChartDataSet in data {
  158. set.mode = (set.mode == .stepped) ? .linear : .stepped
  159. }
  160. chartView.setNeedsDisplay()
  161. case .toggleHorizontalCubic:
  162. for case let set as LineChartDataSet in data {
  163. set.mode = (set.mode == .cubicBezier) ? .horizontalBezier : .cubicBezier
  164. }
  165. chartView.setNeedsDisplay()
  166. case .toggleGradientLine:
  167. for set in chartView.data!.dataSets as! [LineChartDataSet] {
  168. set.isDrawLineWithGradientEnabled = !set.isDrawLineWithGradientEnabled
  169. setup(set)
  170. }
  171. chartView.setNeedsDisplay()
  172. default:
  173. super.handleOption(option, forChartView: chartView)
  174. }
  175. }
  176. @IBAction func slidersValueChanged(_ sender: Any?) {
  177. sliderTextX.text = "\(Int(sliderX.value))"
  178. sliderTextY.text = "\(Int(sliderY.value))"
  179. self.updateChartData()
  180. }
  181. }