PiePolylineChartViewController.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // PiePolylineChartViewController.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 Charts
  10. class PiePolylineChartViewController: DemoBaseViewController {
  11. @IBOutlet var chartView: PieChartView!
  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 = "Pie Poly Line Chart"
  20. self.options = [.toggleValues,
  21. .toggleXValues,
  22. .togglePercent,
  23. .toggleHole,
  24. .toggleLabelsMinimumAngle,
  25. .animateX,
  26. .animateY,
  27. .animateXY,
  28. .spin,
  29. .drawCenter,
  30. .saveToGallery,
  31. .toggleData]
  32. self.setup(pieChartView: chartView)
  33. chartView.delegate = self
  34. chartView.legend.enabled = false
  35. chartView.setExtraOffsets(left: 20, top: 0, right: 20, bottom: 0)
  36. sliderX.value = 40
  37. sliderY.value = 100
  38. self.slidersValueChanged(nil)
  39. chartView.animate(xAxisDuration: 1.4, easingOption: .easeOutBack)
  40. }
  41. override func updateChartData() {
  42. if self.shouldHideData {
  43. chartView.data = nil
  44. return
  45. }
  46. self.setDataCount(Int(sliderX.value), range: UInt32(sliderY.value))
  47. }
  48. func setDataCount(_ count: Int, range: UInt32) {
  49. let entries = (0..<count).map { (i) -> PieChartDataEntry in
  50. // 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.
  51. return PieChartDataEntry(value: Double(arc4random_uniform(range) + range / 5),
  52. label: parties[i % parties.count])
  53. }
  54. let set = PieChartDataSet(entries: entries, label: "Election Results")
  55. set.sliceSpace = 2
  56. set.colors = ChartColorTemplates.vordiplom()
  57. + ChartColorTemplates.joyful()
  58. + ChartColorTemplates.colorful()
  59. + ChartColorTemplates.liberty()
  60. + ChartColorTemplates.pastel()
  61. + [UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)]
  62. set.valueLinePart1OffsetPercentage = 0.8
  63. set.valueLinePart1Length = 0.2
  64. set.valueLinePart2Length = 0.4
  65. //set.xValuePosition = .outsideSlice
  66. set.yValuePosition = .outsideSlice
  67. let data = PieChartData(dataSet: set)
  68. let pFormatter = NumberFormatter()
  69. pFormatter.numberStyle = .percent
  70. pFormatter.maximumFractionDigits = 1
  71. pFormatter.multiplier = 1
  72. pFormatter.percentSymbol = " %"
  73. data.setValueFormatter(DefaultValueFormatter(formatter: pFormatter))
  74. data.setValueFont(.systemFont(ofSize: 11, weight: .light))
  75. data.setValueTextColor(.black)
  76. chartView.data = data
  77. chartView.highlightValues(nil)
  78. }
  79. override func optionTapped(_ option: Option) {
  80. switch option {
  81. case .toggleXValues:
  82. chartView.drawEntryLabelsEnabled = !chartView.drawEntryLabelsEnabled
  83. chartView.setNeedsDisplay()
  84. case .togglePercent:
  85. chartView.usePercentValuesEnabled = !chartView.usePercentValuesEnabled
  86. chartView.setNeedsDisplay()
  87. case .toggleHole:
  88. chartView.drawHoleEnabled = !chartView.drawHoleEnabled
  89. chartView.setNeedsDisplay()
  90. case .toggleLabelsMinimumAngle:
  91. chartView.sliceTextDrawingThreshold = chartView.sliceTextDrawingThreshold == 0.0 ? 20.0 : 0.0
  92. chartView.setNeedsDisplay()
  93. case .drawCenter:
  94. chartView.drawCenterTextEnabled = !chartView.drawCenterTextEnabled
  95. chartView.setNeedsDisplay()
  96. case .animateX:
  97. chartView.animate(xAxisDuration: 1.4)
  98. case .animateY:
  99. chartView.animate(yAxisDuration: 1.4)
  100. case .animateXY:
  101. chartView.animate(xAxisDuration: 1.4, yAxisDuration: 1.4)
  102. case .spin:
  103. chartView.spin(duration: 2,
  104. fromAngle: chartView.rotationAngle,
  105. toAngle: chartView.rotationAngle + 360,
  106. easingOption: .easeInCubic)
  107. default:
  108. handleOption(option, forChartView: chartView)
  109. }
  110. }
  111. // MARK: - Actions
  112. @IBAction func slidersValueChanged(_ sender: Any?) {
  113. sliderTextX.text = "\(Int(sliderX.value))"
  114. sliderTextY.text = "\(Int(sliderY.value))"
  115. self.updateChartData()
  116. }
  117. }