123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- //
- // 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()
- }
-
- }
- }
|