BarChartViewController.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // BarChartViewController.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. #if canImport(UIKit)
  13. import UIKit
  14. #endif
  15. class BarChartViewController: DemoBaseViewController {
  16. @IBOutlet var chartView: BarChartView!
  17. @IBOutlet var sliderX: UISlider!
  18. @IBOutlet var sliderY: UISlider!
  19. @IBOutlet var sliderTextX: UITextField!
  20. @IBOutlet var sliderTextY: UITextField!
  21. override func viewDidLoad() {
  22. super.viewDidLoad()
  23. // Do any additional setup after loading the view.
  24. self.title = "Bar Chart"
  25. self.options = [.toggleValues,
  26. .toggleHighlight,
  27. .animateX,
  28. .animateY,
  29. .animateXY,
  30. .saveToGallery,
  31. .togglePinchZoom,
  32. .toggleData,
  33. .toggleBarBorders]
  34. self.setup(barLineChartView: chartView)
  35. chartView.delegate = self
  36. chartView.drawBarShadowEnabled = false
  37. chartView.drawValueAboveBarEnabled = false
  38. chartView.maxVisibleCount = 60
  39. let xAxis = chartView.xAxis
  40. xAxis.labelPosition = .bottom
  41. xAxis.labelFont = .systemFont(ofSize: 10)
  42. xAxis.granularity = 1
  43. xAxis.labelCount = 7
  44. xAxis.valueFormatter = DayAxisValueFormatter(chart: chartView)
  45. let leftAxisFormatter = NumberFormatter()
  46. leftAxisFormatter.minimumFractionDigits = 0
  47. leftAxisFormatter.maximumFractionDigits = 1
  48. leftAxisFormatter.negativeSuffix = " $"
  49. leftAxisFormatter.positiveSuffix = " $"
  50. let leftAxis = chartView.leftAxis
  51. leftAxis.labelFont = .systemFont(ofSize: 10)
  52. leftAxis.labelCount = 8
  53. leftAxis.valueFormatter = DefaultAxisValueFormatter(formatter: leftAxisFormatter)
  54. leftAxis.labelPosition = .outsideChart
  55. leftAxis.spaceTop = 0.15
  56. leftAxis.axisMinimum = 0 // FIXME: HUH?? this replaces startAtZero = YES
  57. let rightAxis = chartView.rightAxis
  58. rightAxis.enabled = true
  59. rightAxis.labelFont = .systemFont(ofSize: 10)
  60. rightAxis.labelCount = 8
  61. rightAxis.valueFormatter = leftAxis.valueFormatter
  62. rightAxis.spaceTop = 0.15
  63. rightAxis.axisMinimum = 0
  64. let l = chartView.legend
  65. l.horizontalAlignment = .left
  66. l.verticalAlignment = .bottom
  67. l.orientation = .horizontal
  68. l.drawInside = false
  69. l.form = .circle
  70. l.formSize = 9
  71. l.font = UIFont(name: "HelveticaNeue-Light", size: 11)!
  72. l.xEntrySpace = 4
  73. // chartView.legend = l
  74. let marker = XYMarkerView(color: UIColor(white: 180/250, alpha: 1),
  75. font: .systemFont(ofSize: 12),
  76. textColor: .white,
  77. insets: UIEdgeInsets(top: 8, left: 8, bottom: 20, right: 8),
  78. xAxisValueFormatter: chartView.xAxis.valueFormatter!)
  79. marker.chartView = chartView
  80. marker.minimumSize = CGSize(width: 80, height: 40)
  81. chartView.marker = marker
  82. sliderX.value = 12
  83. sliderY.value = 50
  84. slidersValueChanged(nil)
  85. }
  86. override func updateChartData() {
  87. if self.shouldHideData {
  88. chartView.data = nil
  89. return
  90. }
  91. self.setDataCount(Int(sliderX.value) + 1, range: UInt32(sliderY.value))
  92. }
  93. func setDataCount(_ count: Int, range: UInt32) {
  94. let start = 1
  95. let yVals = (start..<start+count+1).map { (i) -> BarChartDataEntry in
  96. let mult = range + 1
  97. let val = Double(arc4random_uniform(mult))
  98. if arc4random_uniform(100) < 25 {
  99. return BarChartDataEntry(x: Double(i), y: val, icon: UIImage(named: "icon"))
  100. } else {
  101. return BarChartDataEntry(x: Double(i), y: val)
  102. }
  103. }
  104. var set1: BarChartDataSet! = nil
  105. if let set = chartView.data?.first as? BarChartDataSet {
  106. set1 = set
  107. set1.replaceEntries(yVals)
  108. chartView.data?.notifyDataChanged()
  109. chartView.notifyDataSetChanged()
  110. } else {
  111. set1 = BarChartDataSet(entries: yVals, label: "The year 2017")
  112. set1.colors = ChartColorTemplates.material()
  113. set1.drawValuesEnabled = false
  114. let data = BarChartData(dataSet: set1)
  115. data.setValueFont(UIFont(name: "HelveticaNeue-Light", size: 10)!)
  116. data.barWidth = 0.9
  117. chartView.data = data
  118. }
  119. // chartView.setNeedsDisplay()
  120. }
  121. override func optionTapped(_ option: Option) {
  122. super.handleOption(option, forChartView: chartView)
  123. }
  124. // MARK: - Actions
  125. @IBAction func slidersValueChanged(_ sender: Any?) {
  126. sliderTextX.text = "\(Int(sliderX.value + 2))"
  127. sliderTextY.text = "\(Int(sliderY.value))"
  128. self.updateChartData()
  129. }
  130. }