IHHistoryBarChartView.swift 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. //
  2. // IHHistoryBarChartView.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/2/19.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import Charts
  10. class IHHistoryBarChartView: UIView {
  11. weak var delegate :IHLineChartViewDelegate?
  12. var data:[String]? {
  13. didSet{
  14. if let data = self.data {
  15. var yData = [Double]()
  16. for str in data {
  17. let a = String(format: "%.1f", Double(str)!)
  18. let y = Double(a)
  19. yData.append(y!)
  20. }
  21. self.yData = yData
  22. self.setDataCount()
  23. }
  24. }
  25. }
  26. var yData :[Double]?
  27. var xVals:[String]? = [String]()
  28. var avarageValue:String?{
  29. didSet{
  30. if let avarage = self.avarageValue {
  31. limitline.label = avarage
  32. limitline.limit = Double(avarage)!
  33. }
  34. }
  35. }
  36. var unit:String?{
  37. didSet{
  38. if let unit = self.unit {
  39. unitLabel.text = unit
  40. }
  41. }
  42. }
  43. lazy var unitLabel: UILabel = {
  44. let unitLabel = UILabel(frame: CGRect(x: 10, y: 0, width: 100, height: 15))
  45. unitLabel.text = "kWh"
  46. unitLabel.textColor = UIColor(hexString: "#A3AFBB")
  47. unitLabel.font = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)
  48. return unitLabel
  49. }()
  50. //限制线
  51. lazy var limitline: ChartLimitLine = {
  52. let limitline = ChartLimitLine(limit: 80, label: "80")
  53. limitline.lineWidth = 1.5
  54. // limitline.lineColor = UIColor(hexString: "#05CFAB")
  55. limitline.lineColor = UIColor.init(red: 198/255.0, green: 196/255.0, blue: 214/255.0, alpha: 1.0)
  56. limitline.lineDashLengths = [4,2]
  57. limitline.labelPosition = .topRight
  58. // limitline.valueTextColor = UIColor(hexString: "#05CFAB")
  59. limitline.valueTextColor = UIColor.init(red: 198/255.0, green: 196/255.0, blue: 214/255.0, alpha: 1.0)
  60. limitline.valueFont = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)!
  61. return limitline
  62. }()
  63. lazy var chartView: BarChartView = {
  64. let chartView = BarChartView()
  65. return chartView
  66. }()
  67. override init(frame: CGRect) {
  68. super.init(frame: frame)
  69. configChartView()
  70. }
  71. required init?(coder: NSCoder) {
  72. fatalError("init(coder:) has not been implemented")
  73. }
  74. func setBarChartData(_ report:ReportData?){
  75. if report?.dataList == nil || report?.dataList?.count == 0 {
  76. return
  77. }
  78. //生成10条随机数据
  79. var dataEntries = [BarChartDataEntry]()
  80. for i in 0..<31 {
  81. let y = arc4random() % 100
  82. let entry = BarChartDataEntry(x: Double(i), y: Double(y))
  83. dataEntries.append(entry)
  84. }
  85. //这10条数据作为柱状图的所有数据
  86. let chartDataSet = BarChartDataSet(entries: dataEntries, label: "")
  87. chartDataSet.barShadowColor = UIColor(hexString: "#EBF2ED")!
  88. chartDataSet.drawValuesEnabled = false
  89. // #05CFAB
  90. chartDataSet.colors = [UIColor(hexString: "#573F95")!]
  91. // #05CFAB
  92. chartDataSet.highlightColor = UIColor(hexString: "#573F95")!//高梁颜色
  93. //目前只有一组柱状图
  94. let chartData = BarChartData(dataSets: [chartDataSet])
  95. //设置柱子宽度
  96. chartData.barWidth = 0.2
  97. //设置柱状图数据
  98. chartView.data = chartData
  99. }
  100. func configChartView() {
  101. addSubview(chartView)
  102. chartView.addSubview(unitLabel)
  103. chartView.barCornerRadius = 0 //自定义属性 这里需要事先设置 ,不然无法渲染
  104. // chartView.animate(yAxisDuration: 2)
  105. //设置间隙
  106. chartView.setExtraOffsets(left: 0 , top: 0, right: 0, bottom: 0)
  107. //代理方法
  108. chartView.delegate = self
  109. //chartView.drawBarShadowEnabled = true
  110. chartView.chartDescription?.enabled = false
  111. chartView.scaleYEnabled = false
  112. // chartView.scaleXEnabled = false
  113. chartView.doubleTapToZoomEnabled = false
  114. // chartView.dragEnabled = false
  115. // chartView.setScaleEnabled(false)
  116. chartView.pinchZoomEnabled = false
  117. //s只滑动不滚动(系统gneiss默认先缩放后滑动)以及初始化时x轴就缩放1.5倍,就可以滑动了
  118. let scaleX = chartView.viewPortHandler
  119. scaleX?.setMinimumScaleX(1.5)
  120. chartView.xAxis.drawGridLinesEnabled = false
  121. chartView.rightAxis.enabled = false
  122. chartView.legend.enabled = false //不需要显示图例
  123. chartView.drawBordersEnabled = false
  124. // 删除x轴线和y轴:
  125. chartView.xAxis.drawAxisLineEnabled = false
  126. chartView.leftAxis.drawAxisLineEnabled = false
  127. //bottom Axis 横坐标
  128. let xAxis = chartView.xAxis
  129. xAxis.labelPosition = .bottom //位置
  130. xAxis.labelCount = 4
  131. xAxis.labelFont = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)!
  132. xAxis.labelTextColor = UIColor(hexString: "#949DB0")
  133. //xAxis.valueFormatter = DayAxisValueFormatter(chart: chartView)
  134. //左边轴 y轴
  135. let leftAxis = chartView.leftAxis
  136. leftAxis.enabled = true //绘制右边轴
  137. leftAxis.valueFormatter = LargeValueFormatter()
  138. leftAxis.labelTextColor = UIColor(hexString: "#A3AFBB")
  139. leftAxis.labelFont = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)!
  140. //leftAxis.axisLineColor = .red
  141. leftAxis.axisMinimum = 0 //最小值从0开始
  142. leftAxis.spaceTop = 0.4
  143. leftAxis.labelCount = 5
  144. //设置网格线
  145. // chartView.
  146. leftAxis.drawGridLinesEnabled = true //不绘制网格线(X轴就绘制竖线,Y轴绘制横线)
  147. leftAxis.gridColor = UIColor(hexString: "#C6CDD5")
  148. leftAxis.gridLineWidth = 0.5 //x轴对应网格线的大小
  149. leftAxis.gridLineDashLengths = [4,2] //虚线各段长度
  150. //添加限制线
  151. leftAxis.addLimitLine(limitline)//添加到U轴上
  152. }
  153. override func layoutSubviews() {
  154. super.layoutSubviews()
  155. chartView.frame = self.bounds
  156. }
  157. func setDataCount() {
  158. var dataEntries = [BarChartDataEntry]()
  159. for i in 0..<(yData?.count)! {
  160. let yval = yData![i]
  161. let entry = BarChartDataEntry(x: Double(i), y: yval)
  162. dataEntries.append(entry)
  163. }
  164. //这10条数据作为柱状图的所有数据
  165. let chartDataSet = BarChartDataSet(entries: dataEntries, label: "")
  166. chartDataSet.barShadowColor = UIColor.white
  167. chartDataSet.drawValuesEnabled = false
  168. // #05CFAB
  169. chartDataSet.colors = [UIColor(hexString: "#573F95" ,transparency: 0.8)!]
  170. // #05CFAB
  171. chartDataSet.highlightColor = UIColor(hexString: "#573F95",transparency: 0.8)!//高梁颜色
  172. //目前只有一组柱状图
  173. let chartData = BarChartData(dataSets: [chartDataSet])
  174. chartView.animate(yAxisDuration: 2)
  175. chartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: xVals!)
  176. //设置柱状图数据
  177. chartView.data = chartData
  178. chartView.animate(yAxisDuration: 2)
  179. let marker = XYMarkerView(color: UIColor(hexString: "#573F95")!, font: .systemFont(ofSize: 12), textColor: .white, insets: UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5), xAxisValueFormatter: IndexAxisValueFormatter(values: xVals!))
  180. marker.chartView = chartView
  181. marker.minimumSize = CGSize(width: 80, height: 20)
  182. marker.isBarchart = true
  183. marker.chartView = chartView
  184. chartView.marker = marker
  185. }
  186. }
  187. extension IHHistoryBarChartView :ChartViewDelegate{
  188. func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
  189. let marker = chartView.marker as! XYMarkerView
  190. marker.isSeleted = true
  191. var chartDataSet = BarChartDataSet()
  192. //LineChartDataSet
  193. chartDataSet = (chartView.data?.dataSets[0] as? BarChartDataSet)!
  194. let values = chartDataSet.entries
  195. let index = values.index(where: {$0.x == highlight.x}) //获取索引
  196. if let delegate = self.delegate {
  197. delegate.lineChartDidSelected(index ?? 0)
  198. }
  199. }
  200. func chartValueNothingSelected(_ chartView: ChartViewBase) {
  201. let marker = chartView.marker as! XYMarkerView
  202. marker.isSeleted = false
  203. if let delegate = self.delegate {
  204. delegate.lineChartDeselected()
  205. }
  206. }
  207. }