IHQualityChartsCell.swift 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. //
  2. // IHQualityChartsCell.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/3/10.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import Charts
  10. class IHQualityChartsCell: UITableViewCell {
  11. var averageAir:String?{
  12. didSet{
  13. self.valueLabel.text = self.averageAir
  14. }
  15. }
  16. var yData :[Double]? = [Double]()
  17. var dataList :[String]?{
  18. didSet{
  19. if let data = self.dataList {
  20. var yData = [Double]()
  21. for str in data {
  22. let a = String(format: "%.1f", Double(str)!)
  23. let y = Double(a)
  24. yData.append(y!)
  25. }
  26. self.yData = yData
  27. updateChartData()
  28. }
  29. }
  30. }
  31. var timeList:[String]?{
  32. didSet{
  33. if let timeList = self.timeList {
  34. chartView!.xAxis.valueFormatter = IndexAxisValueFormatter(values: timeList)
  35. }
  36. }
  37. }
  38. @IBOutlet weak var qualityLabel: UILabel!
  39. @IBOutlet weak var valueLabel: UILabel!
  40. @IBOutlet weak var bgView: UIView!
  41. @IBOutlet weak var chartsBox: UIView!
  42. var chartView: LineChartView?
  43. override func awakeFromNib() {
  44. super.awakeFromNib()
  45. setupUI()
  46. }
  47. override func layoutSubviews() {
  48. super.layoutSubviews()
  49. }
  50. override func setSelected(_ selected: Bool, animated: Bool) {
  51. super.setSelected(selected, animated: animated)
  52. }
  53. }
  54. extension IHQualityChartsCell{
  55. func setupUI() {
  56. //渲染背景图
  57. renderBgView()
  58. //设置折线图
  59. configChartView()
  60. }
  61. func renderBgView() {
  62. // fillCode
  63. let bgLayer1 = CAGradientLayer()
  64. bgLayer1.colors = [UIColor(red: 0.64, green: 0.98, blue: 0.92, alpha: 1).cgColor, UIColor(red: 0.18, green: 0.65, blue: 0.89, alpha: 1).cgColor]
  65. bgLayer1.locations = [0, 1]
  66. bgLayer1.frame = CGRect(x: 0, y: 0, width: KSCREENWIDTH - 40, height: 132)
  67. bgLayer1.startPoint = CGPoint(x: 0, y: 0)
  68. bgLayer1.endPoint = CGPoint(x: 0, y: 1)
  69. bgView.layer.insertSublayer(bgLayer1, at: 0)//移到底层
  70. }
  71. func configChartView() {
  72. self.chartView = LineChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH - 40 , height: chartsBox.bounds.size.height))
  73. chartsBox.addSubview(chartView!)
  74. //设置间隙
  75. // chartView?.setExtraOffsets(left: 10, top: 10, right: 10, bottom: 20)
  76. //代理方法
  77. chartView?.delegate = self
  78. chartView?.chartDescription?.enabled = false
  79. chartView?.scaleYEnabled = false
  80. chartView?.doubleTapToZoomEnabled = false
  81. chartView?.dragEnabled = false
  82. chartView?.setScaleEnabled(false)
  83. chartView?.pinchZoomEnabled = false
  84. chartView?.xAxis.drawGridLinesEnabled = false
  85. chartView?.noDataTextColor = UIColor.white
  86. let marker = IHBalloonMarker(color: .clear,
  87. font: .systemFont(ofSize: 12),
  88. textColor: .white,
  89. insets: UIEdgeInsets(top: 8, left: 8, bottom: 20, right: 8))
  90. marker.chartView = chartView
  91. marker.minimumSize = CGSize(width: 80, height: 40)
  92. chartView?.marker = marker
  93. let leftAxis = chartView?.leftAxis
  94. leftAxis?.enabled = false //绘制右边轴
  95. leftAxis?.labelTextColor = UIColor.clear
  96. leftAxis?.axisLineColor = .clear
  97. leftAxis?.gridColor = UIColor.clear
  98. // leftAxis?.gridLineDashLengths = [2, 1]
  99. leftAxis?.drawLimitLinesBehindDataEnabled = false
  100. chartView?.rightAxis.enabled = false
  101. chartView?.legend.form = .line
  102. //bottom Axis
  103. let bmxAxis = chartView?.xAxis
  104. bmxAxis?.enabled = true
  105. bmxAxis?.labelPosition = .bottom
  106. bmxAxis!.labelCount = 7
  107. bmxAxis?.labelTextColor = UIColor.white
  108. bmxAxis?.forceLabelsEnabled = true
  109. bmxAxis?.avoidFirstLastClippingEnabled = true
  110. bmxAxis?.drawAxisLineEnabled = true
  111. bmxAxis?.gridColor = UIColor(hexString: "#FFFFFF")!
  112. bmxAxis?.gridLineDashLengths = [2, 1]
  113. bmxAxis?.drawLimitLinesBehindDataEnabled = false
  114. bmxAxis?.axisLineColor = UIColor.clear
  115. chartView?.animate(xAxisDuration: 2)
  116. }
  117. func updateChartData() {
  118. self.setDataCount()
  119. }
  120. func setDataCount() {
  121. var values = [ChartDataEntry]()
  122. for i in 0..<(yData?.count)! {
  123. let yval = yData![i]
  124. let entry = ChartDataEntry(x: Double(i), y: yval)
  125. values.append(entry)
  126. }
  127. let set1 = LineChartDataSet(entries: values, label: "")
  128. set1.drawIconsEnabled = false
  129. // set1.lineDashLengths = [5, 2.5]
  130. // set1.highlightLineDashLengths = [5, 2.5]
  131. set1.setColor(.white)
  132. set1.lineWidth = 1
  133. set1.circleRadius = 4
  134. set1.circleColors = [UIColor(hexString: "#FFFFFF")!]
  135. set1.drawCircleHoleEnabled = true
  136. set1.circleHoleRadius = 2
  137. set1.circleHoleColor = .clear
  138. set1.valueFont = .systemFont(ofSize: 9)
  139. set1.formLineDashLengths = [5, 2.5]
  140. set1.formLineWidth = 1
  141. set1.formSize = 15
  142. set1.mode = .cubicBezier
  143. set1.drawCirclesEnabled = false
  144. set1.drawValuesEnabled = false
  145. set1.highlightEnabled = true //不启用十字线
  146. set1.highlightColor = UIColor.clear
  147. let gradientColors = [ChartColorTemplates.colorFromString("#00ff0000").cgColor,
  148. ChartColorTemplates.colorFromString("#ffff0000").cgColor]
  149. let gradient = CGGradient(colorsSpace: nil, colors: gradientColors as CFArray, locations: nil)!
  150. set1.fillAlpha = 1
  151. set1.fill = Fill(linearGradient: gradient, angle: 90)
  152. set1.drawFilledEnabled = false
  153. let data = LineChartData(dataSet: set1)
  154. chartView!.data = data
  155. chartView?.animate(xAxisDuration: 2)
  156. }
  157. }
  158. extension IHQualityChartsCell: ChartViewDelegate{
  159. func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
  160. chartView.setNeedsDisplay()
  161. print("选中了一个数据 - ")
  162. var chartDataSet = LineChartDataSet()
  163. chartDataSet = (chartView.data?.dataSets[0] as? LineChartDataSet)!
  164. chartDataSet.drawCirclesEnabled = true
  165. let values = chartDataSet.entries
  166. print("选中了一个数据 - \(entry) ")
  167. chartDataSet.circleColors.removeAll()
  168. let index = values.index(where: {$0.x == highlight.x}) //获取索引
  169. for i in 0..<values.count {
  170. chartDataSet.circleColors.append(.clear)
  171. // if i == index {
  172. // chartDataSet.circleHoleColor = UIColor(hexString: "#05CFAB")
  173. // }else{
  174. chartDataSet.circleHoleColor = .clear
  175. // }
  176. }
  177. log.debug("chart.xAxis \(chartView.xAxis )")
  178. //选中颜色
  179. chartDataSet.circleColors[index! ] = UIColor(hexString: "#FFFFFF")!
  180. //重新渲染表格
  181. chartView.data?.notifyDataChanged()
  182. chartView.notifyDataSetChanged()
  183. }
  184. // Called when nothing has been selected or an "un-select" has been made.
  185. func chartValueNothingSelected(_ chartView: ChartViewBase){
  186. log.debug("取消选中数据")
  187. //还原选中数据
  188. var chartDataSet = LineChartDataSet()
  189. chartDataSet.drawCirclesEnabled = false
  190. chartDataSet = (chartView.data?.dataSets[0] as? LineChartDataSet)!
  191. let values = chartDataSet.entries
  192. chartDataSet.circleColors.removeAll()
  193. for i in 0..<values.count {
  194. chartDataSet.circleColors.append(.clear)
  195. }
  196. chartDataSet.circleHoleColor = .clear
  197. //重新渲染表格
  198. chartView.data?.notifyDataChanged()
  199. chartView.notifyDataSetChanged()
  200. }
  201. }