| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 | ////  SBTChartsView.swift//  SolarBT////  Created by weclouds on 2019/2/27.//  Copyright © 2019 weclouds. All rights reserved.//import UIKitextension UIImage{   /**     * 生成给你一张渐变色的图片     * colors  颜色数组     * rect    图片大小     *  返回渐变图片     */}struct BarIndexPath {    var viewIndex : Int?    var barIndex: Int?}class SBTChartsView: UIView{          //读取超压电压~            var arr0 : [Float]? = [Float]()    var arr1 : [Float]? = [Float]()    var arr2 : [Float]? = [Float]()    var arr3 : [Float]? = [Float]()    var arr4 : [Float]? = [Float]()    var arr5 : [Float]? = [Float]()    var arr6 : [Float]? = [Float]()    var arr7 : [Float]? = [Float]()//    var arr8 : [Float]? = [Float]()//    var arr9 : [Float]? = [Float]()    var weekData : [OneDayData]? {        didSet{                   }    }        var lastButton:UIButton? = UIButton()    var selectedIndex: Int? = 0        func  fillChartsData(_ weekData : [OneDayData]?)  {        arr0?.removeAll()        arr1?.removeAll()        arr2?.removeAll()        arr3?.removeAll()        arr4?.removeAll()        arr5?.removeAll()        if let arr  = weekData {            for i in 0..<arr.count {                let oneDay = arr[i]                let his_batteryVoltageMin = Float(oneDay.his_batteryVoltageMin!)// 蓄电池最低电压                arr0?.append(his_batteryVoltageMin!)                let his_batteryVoltageMax = Float(oneDay.his_batteryVoltageMax!)// 蓄电池最高电压                arr1?.append(his_batteryVoltageMax!)                //充电                let his_chargingCurrentMax = Float(oneDay.his_chargingCurrentMax!)// 充电最大电流                arr2?.append(his_chargingCurrentMax!)                let his_generationCapacity = String(format: "%.3f", Double(oneDay.his_generationCapacity!)! * 0.001)// // 发电量                //                arr8?.append(his_generationCapacity! * 0.001)                arr3?.append(Float(his_generationCapacity) as! Float)                                              //放电                let his_dischargeCurrentmax = Float(oneDay.his_dischargeCurrentmax!) // 放电最大电流                arr4?.append(his_dischargeCurrentmax!)                              let his_dischargeCapacity = String(format: "%.3f", Double(oneDay.his_dischargeCapacity!)! * 0.001)// 放电量                arr5?.append(Float(his_dischargeCapacity) as! Float)               // log.debug("发点量--- \(his_generationCapacity)放电量 === \(his_dischargeCapacity)")            }        }        configCharts()                notificationChangeToolButton()                let barIndex = AppShare.batIndexPath                if barIndex != nil {            if barIndex?.viewIndex == 0{                batteryChartView.selectedIndex((barIndex?.barIndex)!)            }else if barIndex?.viewIndex == 1 {                chargeChartView.selectedIndex((barIndex?.barIndex)!)            }else if barIndex?.viewIndex == 2 {                dischargeChartView.selectedIndex((barIndex?.barIndex)!)            }        }                      }           lazy var batteryChartView: DVBarChartView = {        let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356  - 80 ))        chartView.delegate = self        chartView.barGap = 17        chartView.barWidth = 33        chartView.yAxisViewWidth = 50        chartView.numberOfYAxisElements = 5        chartView.xAxisTitleArray = self.dayArr        chartView.backColor = UIColor.white        chartView.axisColor = UIColor(hexString: "#E4E4E4")        chartView.xValues = arr0 as? NSMutableArray        chartView.xValues2 = arr1 as? NSMutableArray        chartView.yAxisMaxValue = 7000 * 2;  //        chartView.isHidden = true        chartView.tag = 100000      //  chartView.isLandspace = true        chartView.draw()        return chartView    }()        lazy var chargeChartView: DVBarChartView = {        let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356  - 80 ))        chartView.delegate = self        chartView.barGap = 17        chartView.barWidth = 33        chartView.yAxisViewWidth = 50        chartView.numberOfYAxisElements = 5        chartView.xAxisTitleArray = self.dayArr        chartView.backColor = UIColor.white        chartView.axisColor = UIColor(hexString: "#E4E4E4")        chartView.yAxisMaxValue = 2500;        chartView.isHidden = true        chartView.tag = 100001        chartView.draw()        return chartView    }()        lazy var dischargeChartView: DVBarChartView = {        let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356  - 80 ))        chartView.delegate = self        chartView.barGap = 17        chartView.barWidth = 33        chartView.yAxisViewWidth = 50        chartView.numberOfYAxisElements = 5        chartView.xAxisTitleArray = self.dayArr        chartView.backColor = UIColor.white        chartView.axisColor = UIColor(hexString: "#E4E4E4")        chartView.yAxisMaxValue = 2500;        chartView.isHidden = true        chartView.tag = 100002        chartView.draw()        return chartView    }()    //    lazy var electricityChartView: DVBarChartView = {//        let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356  - 80 ))//        chartView.barGap = 36//        chartView.barWidth = 30//        chartView.yAxisViewWidth = 50//        chartView.numberOfYAxisElements = 5//        chartView.xAxisTitleArray = self.dayArr//        chartView.backColor = UIColor.white//        chartView.axisColor = UIColor(hexString: "#E4E4E4")////        chartView.yAxisMaxValue = 65.535 * 2 ;//        chartView.isHidden = true//        chartView.tag = 100003//        chartView.draw()//        return chartView//    }()        lazy var toolbar: UIView = {        let toolbar = UIView()        toolbar.backgroundColor = UIColor.white        toolbar.layer.masksToBounds = true        toolbar.layer.cornerRadius = 15        toolbar.layer.borderWidth = 1        toolbar.layer.borderColor = UIColor(hexString: "#DEDEDE")?.cgColor        return toolbar    }()    let btnTitles = ["Battery".da_localizedStr(),"Charge".da_localizedStr(),"Discharge".da_localizedStr()]        var dayArr :[String]?        override init(frame: CGRect) {        super.init(frame: frame)       //self.backgroundColor = UIColor.blue        dayArr = [String]()               let first   = nowTime("yyyy-M-d")        let second  = getLastDay(first)        let third   = getLastDay(second)        let foreth  = getLastDay(third)        let fifth   = getLastDay(foreth)        let sixth   = getLastDay(fifth)        let seventh = getLastDay(sixth)        let eighth  = getLastDay(seventh)        dayArr?.append("Today".da_localizedStr())        dayArr?.append("Yesterday".da_localizedStr())        dayArr?.append(third.subString(start: 5))        dayArr?.append(foreth.subString(start: 5))        dayArr?.append(fifth.subString(start: 5))        dayArr?.append(sixth.subString(start: 5))        dayArr?.append(seventh.subString(start: 5))        dayArr?.append(eighth.subString(start: 5))        createUI()            }        required init?(coder aDecoder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }        func createUI()  {             addSubview(toolbar)        toolbar.snp.makeConstraints { (make) in            make.bottom.equalToSuperview().offset(-30)            make.left.equalToSuperview().offset(20)            make.right.equalToSuperview().offset(-20)            make.height.equalTo(30)        }                let buttonW = ( KSCREENWIDTH - 30) / 3        let buttonH = 30                for i in 0..<3 {            let btn = UIButton(type: .custom)            btn.setTitle(btnTitles[i], for: .normal)            btn.setTitleColor(UIColor(hexString: "#989898"), for: .normal)            btn.setBackgroundImage(UIImage(named: "toorbar_normal"), for: .normal)            btn.titleLabel?.font = UIFont(name: PingFangSC_Medium, size: 11)                        btn.setTitleColor(UIColor(hexString: "#FFFFFF"), for: .selected)            btn.setBackgroundImage(UIImage(named: "toorbar_selected"), for: .selected)            btn.frame = CGRect(x: CGFloat(i) * buttonW, y: 0, width: buttonW, height: CGFloat(buttonH))            btn.tag = 5000 + i            btn.layer.masksToBounds = true            btn.layer.cornerRadius = 15            btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)            if i == 0 {                btn.isSelected = true                btn.setTitleColor(UIColor(hexString: "#FFFFFF"), for: .selected)                btn.setBackgroundImage(UIImage(named: "toorbar_selected"), for: .selected) // 默认选择第一个               show(batteryChartView)                        }            toolbar.addSubview(btn)                                }                        addSubview(batteryChartView)        addSubview(chargeChartView)        addSubview(dischargeChartView)       // addSubview(electricityChartView)                batteryChartView.snp.makeConstraints { (make) in            make.right.top.left.equalToSuperview()            make.bottom.equalTo(toolbar.snp.top).offset(-40)        }                chargeChartView.snp.makeConstraints { (make) in            make.right.top.left.equalToSuperview()            make.bottom.equalTo(toolbar.snp.top).offset(-40)        }                dischargeChartView.snp.makeConstraints { (make) in            make.right.top.left.equalToSuperview()            make.bottom.equalTo(toolbar.snp.top).offset(-40)        }            }       @objc func btnClick(_ sender : UIButton)  {    for i in 0..<3 {        let btn : UIButton = toolbar.viewWithTag((i + 5000)) as! UIButton        btn.isSelected = false    }    sender.isSelected = true              let index = sender.tag - 5000        if index == 0 {            show(batteryChartView)        }else if index == 1 {            show(chargeChartView)        }else if index == 2 {            show(dischargeChartView)        }//        else if index == 3 {//            show(electricityChartView)//        }          AppShare.toolbarSelectedIndex = index             }            @objc func notificationChangeToolButton()  {        for i in 0..<3 {            let btn : UIButton = toolbar.viewWithTag((i + 5000)) as! UIButton            btn.isSelected = false        }                let selectedIndex = AppShare.toolbarSelectedIndex        let button : UIButton = toolbar.viewWithTag((selectedIndex! + 5000)) as! UIButton        button.isSelected = true                if selectedIndex == 0 {                        show(batteryChartView)        }else if selectedIndex == 1 {            show(chargeChartView)        }else if selectedIndex == 2 {            show(dischargeChartView)        }    }        func show(_ chartView:DVBarChartView)  {        batteryChartView.isHidden = true        chargeChartView.isHidden = true        dischargeChartView.isHidden = true     //   electricityChartView.isHidden = true                chartView.isHidden = false    }    func image(_ color :UIColor) -> UIImage {        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)        UIGraphicsBeginImageContext(rect.size)        let context = UIGraphicsGetCurrentContext()                context?.setFillColor(color.cgColor)        context?.fill(rect)                let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()                return image!    }        func gradientImage(_ colors: [UIColor]?, rect: CGRect) -> UIImage? {        if colors?.count == 0 || rect.equalTo(CGRect.zero){            return nil        }        let gradientLayer = CAGradientLayer()        gradientLayer.frame = rect        gradientLayer.startPoint = CGPoint(x: 0, y: 0)        gradientLayer.endPoint = CGPoint(x: 1, y: 0)        let mutColors = NSMutableArray(capacity: colors!.count)        for color in colors! {            mutColors.add(color.cgColor)        }        gradientLayer.colors = (NSArray(array: mutColors) as! [Any])        UIGraphicsBeginImageContextWithOptions(gradientLayer.frame.size, gradientLayer.isOpaque, 0)        let outputImage = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()        return outputImage    }            //MARK : 设置数据    func configCharts()  {        for i in 0..<3 {            let ccc : DVBarChartView = viewWithTag(100000 + i) as! DVBarChartView            ccc.removeAllPlot()            ccc.reloadInputViews()            if i == 0 {                ccc.addPlot(arr0)                ccc.addPlot2(arr1)                                var TitleArr0 = [String]()                TitleArr0.removeAll()                for value in arr0! {                    let title = String(format: "%@\n%.1fV","Minimum_battery_voltage".da_localizedStr(), value)                    TitleArr0.append(title)                }                                var TitleArr1 = [String]()                TitleArr1.removeAll()                for value in arr1! {                    let title = String(format: "%@\n%.1fV","Maximum_battery_voltage".da_localizedStr(), value)                    TitleArr1.append(title)                }               ccc.xTitles = TitleArr0               ccc.xTitles2 = TitleArr1                //判断最大值                let max0 = CGFloat((arr0?.max())!)                let max1 = CGFloat((arr1?.max())!)                let yAxisMaxValue = max0 > max1 ? max0 : max1               // ccc.yAxisMaxValue = yAxisMaxValue * 2                                ccc.legendTitle1 = "Maximum_battery_voltage".da_localizedStr()                ccc.legendTitle2 = "Minimum_battery_voltage".da_localizedStr()                            }else if i == 1 {                ccc.addPlot(arr2)                ccc.addPlot2(arr3)                var TitleArr0 = [String]()                TitleArr0.removeAll()                for value in arr2! {                    let title = String(format: "%@\n%.2fA","Maximum_current".da_localizedStr(), value)                    TitleArr0.append(title)                }                                var TitleArr1 = [String]()                TitleArr1.removeAll()                for value in arr3! {                    let title = String(format: "%@\n%.3fkWh","Power_ge".da_localizedStr(), value)                    TitleArr1.append(title)                }                                ccc.xTitles = TitleArr1                ccc.xTitles2 = TitleArr0                      //判断最大值                let max0 = CGFloat((arr2?.max())!)                let max1 = CGFloat((arr3?.max())!)                               let a = [max0,max1]                ccc.legendTitle1 = "Maximum_current".da_localizedStr()                ccc.legendTitle2 = "Power_ge".da_localizedStr()             //   ccc.yAxisMaxValue = a.max()! * 3            }else if i == 2 {                ccc.addPlot(arr4)                ccc.addPlot2(arr5)                 var TitleArr0 = [String]()                TitleArr0.removeAll()                for value in arr4! {                    let title = String(format: "%@\n%.2fA","Maximum_discharge_current".da_localizedStr(), value)                    TitleArr0.append(title)                }                                var TitleArr1 = [String]()                TitleArr1.removeAll()                for value in arr5! {                    let title = String(format: "%@\n%.3fkWh","Discharge_amount".da_localizedStr(), value)                    TitleArr1.append(title)                }                ccc.xTitles = TitleArr1                ccc.xTitles2 = TitleArr0                                ccc.legendTitle1 =  "Maximum_discharge_current".da_localizedStr()                ccc.legendTitle2 =  "Discharge_amount".da_localizedStr()              //  ccc.yAxisMaxValue = a.max()! * 3            }            ccc.draw()        }    }}extension SBTChartsView :DVBarChartViewDelegate{    func barChartView(_ barChartView: DVBarChartView!, didSelectedBarAt index: Int) {                 AppShare.batIndexPath = BarIndexPath(viewIndex: barChartView.tag - 100000, barIndex: index)                log.debug( AppShare.batIndexPath)    }}
 |