// // IHHistoryBarChartView.swift // Inhealth // // Created by weclouds on 2020/2/19. // Copyright © 2020 weclouds. All rights reserved. // import UIKit import Charts class IHHistoryBarChartView: UIView { weak var delegate :IHLineChartViewDelegate? var data:[String]? { didSet{ if let data = self.data { var yData = [Double]() for str in data { let a = String(format: "%.1f", Double(str)!) let y = Double(a) yData.append(y!) } self.yData = yData self.setDataCount() } } } var yData :[Double]? var xVals:[String]? = [String]() var avarageValue:String?{ didSet{ if let avarage = self.avarageValue { limitline.label = avarage limitline.limit = Double(avarage)! } } } var unit:String?{ didSet{ if let unit = self.unit { unitLabel.text = unit } } } lazy var unitLabel: UILabel = { let unitLabel = UILabel(frame: CGRect(x: 10, y: 0, width: 100, height: 15)) unitLabel.text = "kWh" unitLabel.textColor = UIColor(hexString: "#A3AFBB") unitLabel.font = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11) return unitLabel }() //限制线 lazy var limitline: ChartLimitLine = { let limitline = ChartLimitLine(limit: 80, label: "80") limitline.lineWidth = 1.5 // limitline.lineColor = UIColor(hexString: "#05CFAB") limitline.lineColor = UIColor.init(red: 198/255.0, green: 196/255.0, blue: 214/255.0, alpha: 1.0) limitline.lineDashLengths = [4,2] limitline.labelPosition = .topRight // limitline.valueTextColor = UIColor(hexString: "#05CFAB") limitline.valueTextColor = UIColor.init(red: 198/255.0, green: 196/255.0, blue: 214/255.0, alpha: 1.0) limitline.valueFont = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)! return limitline }() lazy var chartView: BarChartView = { let chartView = BarChartView() return chartView }() override init(frame: CGRect) { super.init(frame: frame) configChartView() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setBarChartData(_ report:ReportData?){ if report?.dataList == nil || report?.dataList?.count == 0 { return } //生成10条随机数据 var dataEntries = [BarChartDataEntry]() for i in 0..<31 { let y = arc4random() % 100 let entry = BarChartDataEntry(x: Double(i), y: Double(y)) dataEntries.append(entry) } //这10条数据作为柱状图的所有数据 let chartDataSet = BarChartDataSet(entries: dataEntries, label: "") chartDataSet.barShadowColor = UIColor(hexString: "#EBF2ED")! chartDataSet.drawValuesEnabled = false // #05CFAB chartDataSet.colors = [UIColor(hexString: "#573F95")!] // #05CFAB chartDataSet.highlightColor = UIColor(hexString: "#573F95")!//高梁颜色 //目前只有一组柱状图 let chartData = BarChartData(dataSets: [chartDataSet]) //设置柱子宽度 chartData.barWidth = 0.2 //设置柱状图数据 chartView.data = chartData } func configChartView() { addSubview(chartView) chartView.addSubview(unitLabel) chartView.barCornerRadius = 0 //自定义属性 这里需要事先设置 ,不然无法渲染 // chartView.animate(yAxisDuration: 2) //设置间隙 chartView.setExtraOffsets(left: 0 , top: 0, right: 0, bottom: 0) //代理方法 chartView.delegate = self //chartView.drawBarShadowEnabled = true chartView.chartDescription?.enabled = false chartView.scaleYEnabled = false // chartView.scaleXEnabled = false chartView.doubleTapToZoomEnabled = false // chartView.dragEnabled = false // chartView.setScaleEnabled(false) chartView.pinchZoomEnabled = false //s只滑动不滚动(系统gneiss默认先缩放后滑动)以及初始化时x轴就缩放1.5倍,就可以滑动了 let scaleX = chartView.viewPortHandler scaleX?.setMinimumScaleX(1.5) chartView.xAxis.drawGridLinesEnabled = false chartView.rightAxis.enabled = false chartView.legend.enabled = false //不需要显示图例 chartView.drawBordersEnabled = false // 删除x轴线和y轴: chartView.xAxis.drawAxisLineEnabled = false chartView.leftAxis.drawAxisLineEnabled = false //bottom Axis 横坐标 let xAxis = chartView.xAxis xAxis.labelPosition = .bottom //位置 xAxis.labelCount = 4 xAxis.labelFont = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)! xAxis.labelTextColor = UIColor(hexString: "#949DB0") //xAxis.valueFormatter = DayAxisValueFormatter(chart: chartView) //左边轴 y轴 let leftAxis = chartView.leftAxis leftAxis.enabled = true //绘制右边轴 leftAxis.valueFormatter = LargeValueFormatter() leftAxis.labelTextColor = UIColor(hexString: "#A3AFBB") leftAxis.labelFont = UIFont(name: Alibaba_PuHuiTi_Regular, size: 11)! //leftAxis.axisLineColor = .red leftAxis.axisMinimum = 0 //最小值从0开始 leftAxis.spaceTop = 0.4 leftAxis.labelCount = 5 //设置网格线 // chartView. leftAxis.drawGridLinesEnabled = true //不绘制网格线(X轴就绘制竖线,Y轴绘制横线) leftAxis.gridColor = UIColor(hexString: "#C6CDD5") leftAxis.gridLineWidth = 0.5 //x轴对应网格线的大小 leftAxis.gridLineDashLengths = [4,2] //虚线各段长度 //添加限制线 leftAxis.addLimitLine(limitline)//添加到U轴上 } override func layoutSubviews() { super.layoutSubviews() chartView.frame = self.bounds } func setDataCount() { var dataEntries = [BarChartDataEntry]() for i in 0..<(yData?.count)! { let yval = yData![i] let entry = BarChartDataEntry(x: Double(i), y: yval) dataEntries.append(entry) } //这10条数据作为柱状图的所有数据 let chartDataSet = BarChartDataSet(entries: dataEntries, label: "") chartDataSet.barShadowColor = UIColor.white chartDataSet.drawValuesEnabled = false // #05CFAB chartDataSet.colors = [UIColor(hexString: "#573F95" ,transparency: 0.8)!] // #05CFAB chartDataSet.highlightColor = UIColor(hexString: "#573F95",transparency: 0.8)!//高梁颜色 //目前只有一组柱状图 let chartData = BarChartData(dataSets: [chartDataSet]) chartView.animate(yAxisDuration: 2) chartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: xVals!) //设置柱状图数据 chartView.data = chartData chartView.animate(yAxisDuration: 2) 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!)) marker.chartView = chartView marker.minimumSize = CGSize(width: 80, height: 20) marker.isBarchart = true marker.chartView = chartView chartView.marker = marker } } extension IHHistoryBarChartView :ChartViewDelegate{ func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) { let marker = chartView.marker as! XYMarkerView marker.isSeleted = true var chartDataSet = BarChartDataSet() //LineChartDataSet chartDataSet = (chartView.data?.dataSets[0] as? BarChartDataSet)! let values = chartDataSet.entries let index = values.index(where: {$0.x == highlight.x}) //获取索引 if let delegate = self.delegate { delegate.lineChartDidSelected(index ?? 0) } } func chartValueNothingSelected(_ chartView: ChartViewBase) { let marker = chartView.marker as! XYMarkerView marker.isSeleted = false if let delegate = self.delegate { delegate.lineChartDeselected() } } }