PieChartViewController.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. //
  2. // PieChartViewController.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 PieChartViewController: DemoBaseViewController {
  13. @IBOutlet var chartView: PieChartView!
  14. @IBOutlet var sliderX: UISlider!
  15. @IBOutlet var sliderY: UISlider!
  16. @IBOutlet var sliderTextX: UITextField!
  17. @IBOutlet var sliderTextY: UITextField!
  18. override func viewDidLoad() {
  19. super.viewDidLoad()
  20. // Do any additional setup after loading the view.
  21. self.title = "Pie Chart"
  22. self.options = [.toggleValues,
  23. .toggleXValues,
  24. .togglePercent,
  25. .toggleHole,
  26. .toggleIcons,
  27. .toggleLabelsMinimumAngle,
  28. .animateX,
  29. .animateY,
  30. .animateXY,
  31. .spin,
  32. .drawCenter,
  33. .saveToGallery,
  34. .toggleData]
  35. self.setup(pieChartView: chartView)
  36. chartView.delegate = self
  37. let l = chartView.legend
  38. l.horizontalAlignment = .right
  39. l.verticalAlignment = .top
  40. l.orientation = .vertical
  41. l.xEntrySpace = 7
  42. l.yEntrySpace = 0
  43. l.yOffset = 0
  44. // chartView.legend = l
  45. // entry label styling
  46. chartView.entryLabelColor = .white
  47. chartView.entryLabelFont = .systemFont(ofSize: 12, weight: .light)
  48. sliderX.value = 4
  49. sliderY.value = 100
  50. self.slidersValueChanged(nil)
  51. chartView.animate(xAxisDuration: 1.4, easingOption: .easeOutBack)
  52. }
  53. override func updateChartData() {
  54. if self.shouldHideData {
  55. chartView.data = nil
  56. return
  57. }
  58. self.setDataCount(Int(sliderX.value), range: UInt32(sliderY.value))
  59. }
  60. func setDataCount(_ count: Int, range: UInt32) {
  61. let entries = (0..<count).map { (i) -> PieChartDataEntry in
  62. // IMPORTANT: In a PieChart, no values (Entry) should have the same xIndex (even if from different DataSets), since no values can be drawn above each other.
  63. return PieChartDataEntry(value: Double(arc4random_uniform(range) + range / 5),
  64. label: parties[i % parties.count],
  65. icon: #imageLiteral(resourceName: "icon"))
  66. }
  67. let set = PieChartDataSet(entries: entries, label: "Election Results")
  68. set.drawIconsEnabled = false
  69. set.sliceSpace = 2
  70. set.colors = ChartColorTemplates.vordiplom()
  71. + ChartColorTemplates.joyful()
  72. + ChartColorTemplates.colorful()
  73. + ChartColorTemplates.liberty()
  74. + ChartColorTemplates.pastel()
  75. + [UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)]
  76. let data = PieChartData(dataSet: set)
  77. let pFormatter = NumberFormatter()
  78. pFormatter.numberStyle = .percent
  79. pFormatter.maximumFractionDigits = 1
  80. pFormatter.multiplier = 1
  81. pFormatter.percentSymbol = " %"
  82. data.setValueFormatter(DefaultValueFormatter(formatter: pFormatter))
  83. data.setValueFont(.systemFont(ofSize: 11, weight: .light))
  84. data.setValueTextColor(.black)
  85. chartView.data = data
  86. chartView.highlightValues(nil)
  87. }
  88. override func optionTapped(_ option: Option) {
  89. switch option {
  90. case .toggleXValues:
  91. chartView.drawEntryLabelsEnabled = !chartView.drawEntryLabelsEnabled
  92. chartView.setNeedsDisplay()
  93. case .togglePercent:
  94. chartView.usePercentValuesEnabled = !chartView.usePercentValuesEnabled
  95. chartView.setNeedsDisplay()
  96. case .toggleHole:
  97. chartView.drawHoleEnabled = !chartView.drawHoleEnabled
  98. chartView.setNeedsDisplay()
  99. case .toggleLabelsMinimumAngle:
  100. chartView.sliceTextDrawingThreshold = chartView.sliceTextDrawingThreshold == 0.0 ? 20.0 : 0.0
  101. chartView.setNeedsDisplay()
  102. case .drawCenter:
  103. chartView.drawCenterTextEnabled = !chartView.drawCenterTextEnabled
  104. chartView.setNeedsDisplay()
  105. case .animateX:
  106. chartView.animate(xAxisDuration: 1.4)
  107. case .animateY:
  108. chartView.animate(yAxisDuration: 1.4)
  109. case .animateXY:
  110. chartView.animate(xAxisDuration: 1.4, yAxisDuration: 1.4)
  111. case .spin:
  112. chartView.spin(duration: 2,
  113. fromAngle: chartView.rotationAngle,
  114. toAngle: chartView.rotationAngle + 360,
  115. easingOption: .easeInCubic)
  116. default:
  117. handleOption(option, forChartView: chartView)
  118. }
  119. }
  120. // MARK: - Actions
  121. @IBAction func slidersValueChanged(_ sender: Any?) {
  122. sliderTextX.text = "\(Int(sliderX.value))"
  123. sliderTextY.text = "\(Int(sliderY.value))"
  124. self.updateChartData()
  125. }
  126. }