// // MettViewController.swift // Twear // // Created by yangbin on 2022/2/28. // import UIKit import Charts import SwiftDate class MettViewController: UIViewController, DateSegmentViewDelegate, RangeSliderDelegate, ChartViewDelegate { @IBOutlet weak var dateSegmentView: DateSegmentView! @IBOutlet weak var barChartView: BarChartView! @IBOutlet weak var sliderView: RangeSliderView! @IBOutlet weak var dateLabel: UILabel! @IBOutlet weak var valueLabel: UILabel! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var locLabel1: UILabel! @IBOutlet weak var locLabel2: UILabel! @IBOutlet weak var targetLabel: UILabel! @IBOutlet weak var totalLabel: UILabel! private var selectedDate = Date() private var points: [Double] = [] private var dateType: DateType = .week private lazy var monthDays = DateInRegion().monthDays private var mettArray: [MettModel] = [] { didSet { if mettArray.count == 0 { resetLabel() } points = [] } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: true) } override func viewDidLoad() { super.viewDidLoad() dateSegmentView.dayLayout.constant = SCREEN_WIDTH/3.0 - 8 dateSegmentView.dateType = .week dateSegmentView.selectedColor = UIColor.rgbColorFromHex(0x1CC9FD) dateSegmentView.weekButton.setTitleColor(UIColor.rgbColorFromHex(0x1CC9FD), for: .normal) dateSegmentView.delegate = self sliderView.delegate = self titleLabel.text = LocString("梅脱") locLabel1.text = LocString("本周累计") locLabel2.text = LocString("目标") view.layoutIfNeeded() setupChartView() didSelectedDate(date: DateInRegion(), dateType: .week) // Do any additional setup after loading the view. } private func updateLable(_ index: Int) { if mettArray.count == 0 { resetLabel() return } valueLabel.text = "\(mettArray[index].value)" // var value = mettArray[index].value // averageLabel.text = pressureArray[index].value == -1 ? "--" : "\(pressureArray[index].value)" // rangeLabel.text = "\(minArray[index])-\(maxArray[index])" totalLabel.text = "\(mettArray.sum(\.value))" if dateType == .week { targetLabel.text = "600" locLabel2.text = LocString("目标") } else if dateType == .month { targetLabel.text = "\(mettArray.sum(\.value)/selectedDate.weekOfMonth)" locLabel2.text = LocString("每周平均") } else if dateType == .year { targetLabel.text = "\(mettArray.sum(\.value)/selectedDate.weekOfYear)" locLabel2.text = LocString("每周平均") } // switch value { // case 1..<30: // detailLabel.text = LocString("轻松") // case 30..<60: // detailLabel.text = LocString("正常") // case 60..<80: // detailLabel.text = LocString("中等") // case 80..<100: // detailLabel.text = LocString("偏高") // default: // detailLabel.text = LocString("正常") // } // // pressureLabel.text = "\(pressureArray[index].value)" // let sDate = mettArray[index].date! switch dateType { case .day: dateLabel.text = sDate.toString(.custom("HH:mm")) case .week: locLabel1.text = LocString("本周累计") dateLabel.text = sDate.toString(.custom("yyyy.MM.dd")) + " " + sDate.weekText// + " " + LocString("平均血氧") case .month: locLabel1.text = LocString("本月累计") dateLabel.text = sDate.toString(.custom("yyyy.MM.dd"))// + " " + LocString("平均血氧") case .year: locLabel1.text = LocString("本年累计") dateLabel.text = sDate.toString(.custom("yyyy.MM"))// + " " + LocString("平均血氧") } } //MARK: DateSegmentViewDelegate func didSelectedDate(date: DateInRegion, dateType: DateType) { self.dateType = dateType monthDays = date.monthDays selectedDate = date.date // print(selectedDate) // print("年周 \(selectedDate.weekOfYear)") // print("月周 \(selectedDate.weekOfMonth)") // print("-----") switch dateType { case .week: mettArray = MettModel.getMettByWeek(selectedDate) dateLabel.text = (date.dateAt(.startOfWeek)+1.days).toString(.custom("yyyy.MM.dd")) + " " + LocString("周一")// + " " + LocString("平均血氧") case .month: mettArray = MettModel.getMettByMonth(selectedDate) dateLabel.text = date.dateAt(.startOfMonth).toString(.custom("yyyy.MM.dd"))// + " " + LocString("平均血氧") case .year: mettArray = MettModel.getMettByYear(selectedDate) dateLabel.text = date.dateAtStartOf(.year).toString(.custom("yyyy.MM"))// + " " + LocString("平均血氧") default: break } updateChartView() } @IBAction func share(_ sender: Any) { let shareView = ShareView(view.captureImage) shareView.show() } //MARK: RangeSliderDelegate func sliderDidChanged(index: Int) { barChartView.highlightValues([Highlight(x: points[index], y: 0, dataSetIndex: 0)]) updateLable(index) } //MARK: ChartViewDelegate func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) { if mettArray.count == 1 { barChartView.highlightValues([Highlight(x: points[0], y: 0, dataSetIndex: 0)]) } else { sliderView.didSelectedValue(entry.x) } } private func resetLabel() { dateLabel.text = "--" valueLabel.text = "--" totalLabel.text = "--" targetLabel.text = "--" switch dateType { case .week: locLabel2.text = LocString("目标") locLabel1.text = LocString("本周累计") case .month: locLabel1.text = LocString("本月累计") locLabel2.text = LocString("每周平均") case .year: locLabel1.text = LocString("本年累计") locLabel2.text = LocString("每周平均") default: break } } private func updateChartView() { let xAxis = barChartView.xAxis var barWidth: Double = 0.6 switch dateType { case .day: xAxis.valueFormatter = IndexAxisValueFormatter(values: DayXValues) xAxis.labelCount = 9 xAxis.axisMinimum = -2.9 xAxis.axisMaximum = 24 + 2 case .week: barWidth = 0.25 xAxis.valueFormatter = IndexAxisValueFormatter(values: WeekXValues) xAxis.labelCount = 7 xAxis.axisMinimum = -0.8 xAxis.axisMaximum = 6 + 0.8 case .month: xAxis.valueFormatter = IndexAxisValueFormatter(values: MonthXValues(monthDays)) xAxis.labelCount = 8 xAxis.axisMinimum = -3.5 xAxis.axisMinLabels = 8 xAxis.axisMaximum = Double(monthDays-1) + 2.1 case .year: barWidth = 0.4 xAxis.valueFormatter = IndexAxisValueFormatter(values: MonthValues) xAxis.labelCount = 12 xAxis.axisMinimum = -1.3 xAxis.axisMaximum = 11 + 0.8 } var dataEntries = [BarChartDataEntry]() for mett in mettArray { // if mett.value > 0 { var pointX: Double = 0 switch dateType { case .day: break case .week: pointX = Double(mett.date!.weekIndex) case .month: pointX = Double(mett.date!.day-1) case .year: pointX = Double(mett.date!.month-1) } points.append(pointX) dataEntries.append(BarChartDataEntry(x: pointX, y: Double(mett.value))) // } } // for sleep in sleepSummaryArray { // if sleep.sleepLength > 0 { // var pointX: Double = 0 // switch dateType { // case .day: // break // case .week: // barWidth = 0.25 // pointX = Double(sleep.endDate!.weekIndex) // case .month: // pointX = Double(sleep.endDate!.day-1) // case .year: // barWidth = 0.4 // pointX = Double(sleep.endDate!.month-1) // } // points.append(SleepPoint(point: pointX, type: .awake, length: 0)) // dataEntries.append(BarChartDataEntry(x: pointX, y: Double(sleep.light+sleep.deep)/60)) // } // } let dataSet = BarChartDataSet(entries: dataEntries) dataSet.colors = [UIColor.rgbColorFromHex(0x00C5FF)] dataSet.highlightEnabled = true dataSet.highlightColor = UIColor.rgbColorFromHex(0x00C5FF) dataSet.drawValuesEnabled = false let chartData = BarChartData(dataSets: [dataSet]) chartData.barWidth = barWidth barChartView.data = chartData barChartView.highlightValues([Highlight(x: 0, y: 0, dataSetIndex: 0)]) setupSliderViewScale() } private func setupSliderViewScale() { var endPointX: Int = 0 switch dateType { case .day: endPointX = 24 case .week: endPointX = 6 case .month: endPointX = monthDays-1 case .year: endPointX = 11 } sliderView.setDrawSpace(startPointX: getChartViewX(0), endPointX: getChartViewX(endPointX), range: 0...endPointX, points: points, imageName: "slider_mett", isLast: true) } private func getChartViewX(_ x: Int) -> CGFloat { return barChartView.pixelForValues(x: Double(x), y: 0, axis: .left).x } private func setupChartView() { barChartView.delegate = self barChartView.chartDescription?.enabled = false //图描述 barChartView.legend.enabled = false //左下角图例 barChartView.setScaleEnabled(false) //可滑动 barChartView.rightAxis.enabled = false //不绘制右边轴的信息 let leftAxis = barChartView.leftAxis leftAxis.labelTextColor = ChartsTextColor leftAxis.labelFont = ChartsTextFont(11) leftAxis.yOffset = -5 leftAxis.xOffset = -3 leftAxis.gridLineDashLengths = [2.0, 2.0] //设置虚线样式的网格线 leftAxis.gridColor = LineColor leftAxis.gridLineWidth = 1 leftAxis.axisLineWidth = 0 leftAxis.drawGridLinesBehindDataEnabled = false leftAxis.labelPosition = .insideChart leftAxis.axisMinimum = 0 //设置左侧Y轴最小值 leftAxis.axisMaximum = 100 leftAxis.granularity = 20 let litmitLine = ChartLimitLine(limit: 0, label: "") litmitLine.lineWidth = 1 litmitLine.lineColor = LineColor leftAxis.addLimitLine(litmitLine) leftAxis.drawLimitLinesBehindDataEnabled = false //设置限制线绘制在折线图的后面 let xAxis = barChartView.xAxis xAxis.granularity = 1 //间隔 xAxis.labelPosition = .bottom xAxis.labelFont = ChartsTextFont(11) xAxis.labelTextColor = ChartsTextColor xAxis.drawGridLinesBehindDataEnabled = false xAxis.axisLineColor = LineColor xAxis.axisLineWidth = 1 xAxis.gridLineDashLengths = [6, 666] xAxis.gridColor = LineColor xAxis.drawAxisLineEnabled = false } @IBAction func back(_ sender: Any) { navigationController?.popViewController(animated: true) } @IBAction func gotoReferenceVC(_ sender: Any) { let vc = UIStoryboard.loadViewControllerIdentifier(storyboardName: "Home", identifier: "MettReferenceVC") navigationController?.pushViewController(vc, animated: true) } }