LineChartTimeViewController.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //
  2. // LineChartTimeViewController.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 Charts
  12. class LineChartTimeViewController: DemoBaseViewController {
  13. @IBOutlet var chartView: LineChartView!
  14. @IBOutlet var sliderX: UISlider!
  15. @IBOutlet var sliderTextX: UITextField!
  16. override func viewDidLoad() {
  17. super.viewDidLoad()
  18. // Do any additional setup after loading the view.
  19. self.title = "Time Line Chart"
  20. self.options = [.toggleValues,
  21. .toggleFilled,
  22. .toggleCircles,
  23. .toggleCubic,
  24. .toggleHorizontalCubic,
  25. .toggleStepped,
  26. .toggleHighlight,
  27. .animateX,
  28. .animateY,
  29. .animateXY,
  30. .saveToGallery,
  31. .togglePinchZoom,
  32. .toggleAutoScaleMinMax,
  33. .toggleData]
  34. chartView.delegate = self
  35. chartView.chartDescription?.enabled = false
  36. chartView.dragEnabled = true
  37. chartView.setScaleEnabled(true)
  38. chartView.pinchZoomEnabled = false
  39. chartView.highlightPerDragEnabled = true
  40. chartView.backgroundColor = .white
  41. chartView.legend.enabled = false
  42. let xAxis = chartView.xAxis
  43. xAxis.labelPosition = .topInside
  44. xAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
  45. xAxis.labelTextColor = UIColor(red: 255/255, green: 192/255, blue: 56/255, alpha: 1)
  46. xAxis.drawAxisLineEnabled = false
  47. xAxis.drawGridLinesEnabled = true
  48. xAxis.centerAxisLabelsEnabled = true
  49. xAxis.granularity = 3600
  50. xAxis.valueFormatter = DateValueFormatter()
  51. let leftAxis = chartView.leftAxis
  52. leftAxis.labelPosition = .insideChart
  53. leftAxis.labelFont = .systemFont(ofSize: 12, weight: .light)
  54. leftAxis.drawGridLinesEnabled = true
  55. leftAxis.granularityEnabled = true
  56. leftAxis.axisMinimum = 0
  57. leftAxis.axisMaximum = 170
  58. leftAxis.yOffset = -9
  59. leftAxis.labelTextColor = UIColor(red: 255/255, green: 192/255, blue: 56/255, alpha: 1)
  60. chartView.rightAxis.enabled = false
  61. chartView.legend.form = .line
  62. sliderX.value = 100
  63. slidersValueChanged(nil)
  64. chartView.animate(xAxisDuration: 2.5)
  65. }
  66. override func updateChartData() {
  67. if self.shouldHideData {
  68. chartView.data = nil
  69. return
  70. }
  71. self.setDataCount(Int(sliderX.value), range: 30)
  72. }
  73. func setDataCount(_ count: Int, range: UInt32) {
  74. let now = Date().timeIntervalSince1970
  75. let hourSeconds: TimeInterval = 3600
  76. let from = now - (Double(count) / 2) * hourSeconds
  77. let to = now + (Double(count) / 2) * hourSeconds
  78. let values = stride(from: from, to: to, by: hourSeconds).map { (x) -> ChartDataEntry in
  79. let y = arc4random_uniform(range) + 50
  80. return ChartDataEntry(x: x, y: Double(y))
  81. }
  82. let set1 = LineChartDataSet(entries: values, label: "DataSet 1")
  83. set1.axisDependency = .left
  84. set1.setColor(UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1))
  85. set1.lineWidth = 1.5
  86. set1.drawCirclesEnabled = false
  87. set1.drawValuesEnabled = false
  88. set1.fillAlpha = 0.26
  89. set1.fillColor = UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)
  90. set1.highlightColor = UIColor(red: 244/255, green: 117/255, blue: 117/255, alpha: 1)
  91. set1.drawCircleHoleEnabled = false
  92. let data = LineChartData(dataSet: set1)
  93. data.setValueTextColor(.white)
  94. data.setValueFont(.systemFont(ofSize: 9, weight: .light))
  95. chartView.data = data
  96. }
  97. override func optionTapped(_ option: Option) {
  98. switch option {
  99. case .toggleFilled:
  100. for set in chartView.data!.dataSets as! [LineChartDataSet] {
  101. set.drawFilledEnabled = !set.drawFilledEnabled
  102. }
  103. chartView.setNeedsDisplay()
  104. case .toggleCircles:
  105. for set in chartView.data!.dataSets as! [LineChartDataSet] {
  106. set.drawCirclesEnabled = !set.drawCirclesEnabled
  107. }
  108. chartView.setNeedsDisplay()
  109. case .toggleCubic:
  110. for set in chartView.data!.dataSets as! [LineChartDataSet] {
  111. set.mode = (set.mode == .cubicBezier) ? .linear : .cubicBezier
  112. }
  113. chartView.setNeedsDisplay()
  114. case .toggleStepped:
  115. for set in chartView.data!.dataSets as! [LineChartDataSet] {
  116. set.mode = (set.mode == .stepped) ? .linear : .stepped
  117. }
  118. chartView.setNeedsDisplay()
  119. case .toggleHorizontalCubic:
  120. for set in chartView.data!.dataSets as! [LineChartDataSet] {
  121. set.mode = (set.mode == .cubicBezier) ? .horizontalBezier : .cubicBezier
  122. }
  123. chartView.setNeedsDisplay()
  124. default:
  125. super.handleOption(option, forChartView: chartView)
  126. }
  127. }
  128. @IBAction func slidersValueChanged(_ sender: Any?) {
  129. sliderTextX.text = "\(Int(sliderX.value))"
  130. self.updateChartData()
  131. }
  132. }