// // RecordDetailVC.swift // Twear // // Created by yangbin on 2021/12/30. // import UIKit import SwiftDate class RecordDetailVC: UIViewController { @IBOutlet weak var titleTopLayout: NSLayoutConstraint! @IBOutlet weak var tableViewHeight: NSLayoutConstraint! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var totalTitleLabel: UILabel! @IBOutlet weak var timeTitleLabel: UILabel! @IBOutlet weak var distanceTitleLabel: UILabel! @IBOutlet weak var calorieTitleLabel: UILabel! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var totalDistanceLabel: UILabel! @IBOutlet weak var totalCalorieLabel: UILabel! @IBOutlet weak var totalTimeLabel: UILabel! @IBOutlet weak var totalNumberLabel: UILabel! @IBOutlet weak var maxDistanceLabel: UILabel! @IBOutlet weak var maxCalorieLabel: UILabel! @IBOutlet weak var maxTimeLabel: UILabel! @IBOutlet weak var scrollTopLayout: NSLayoutConstraint! var motionType: TrainType = .running private var page: Int = 1 private let nowDate = DateInRegion() private var motionList: [MotionRecord] = [] var user = UserInfo override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.setNavigationBarHidden(true, animated: true) } override var preferredStatusBarStyle: UIStatusBarStyle { if #available(iOS 13.0, *) { return .lightContent } else { return .default } } override func viewDidLoad() { super.viewDidLoad() titleTopLayout.constant = StatusBarHeight + 10 scrollTopLayout.constant = StatusBarHeight calorieTitleLabel.text = LocString("单次最高热量(千卡)") if user.distanceUnit == 0 { totalTitleLabel.text = LocString("累计距离(公里)") } else { totalTitleLabel.text = LocString("累计距离(英里)") } switch motionType { case .running, .run_indoor: titleLabel.text = LocString("跑步记录") timeTitleLabel.text = LocString("单次最长用时") if user.distanceUnit == 0 { distanceTitleLabel.text = LocString("单次最远距离(公里)") } else { distanceTitleLabel.text = LocString("单次最远距离(英里)") } case .walking: titleLabel.text = LocString("步行记录") timeTitleLabel.text = LocString("单次最长用时") if user.distanceUnit == 0 { distanceTitleLabel.text = LocString("单次最远距离(公里)") } else { distanceTitleLabel.text = LocString("单次最远距离(英里)") } case .bicycle: titleLabel.text = LocString("骑行记录") timeTitleLabel.text = LocString("单次最长用时") if user.distanceUnit == 0 { distanceTitleLabel.text = LocString("单次最远距离(公里)") } else { distanceTitleLabel.text = LocString("单次最远距离(英里)") } case .mountaineering: titleLabel.text = LocString("爬山记录") if user.distanceUnit == 0 { timeTitleLabel.text = LocString("单次最远距离(公里)") distanceTitleLabel.text = LocString("单次最高爬升(米)") } else { timeTitleLabel.text = LocString("单次最远距离(英里)") distanceTitleLabel.text = LocString("单次最高爬升(英尺)") } default: titleLabel.text = LocString("运动记录") timeTitleLabel.text = LocString("单次最长用时") if user.distanceUnit == 0 { distanceTitleLabel.text = LocString("单次最远距离(公里)") } else { distanceTitleLabel.text = LocString("单次最远距离(英里)") } } tableView.register(UINib.init(nibName: "MotionRecordCell", bundle: Bundle.main), forCellReuseIdentifier: "MotionRecordCell") tableView.contentInset = UIEdgeInsets.init(top: 0, left: 0, bottom: 0, right: 0) tableView.tableFooterView = UIView(frame: CGRect.zero) getMotionRecordList() // Do any additional setup after loading the view. } @IBAction func back(_ sender: Any) { navigationController?.popViewController(animated: true) } private func getMotionRecordList(page: Int = 1) { if page == 1 { motionList = [] } var totalMotions: [MotionModel] = [] for i in 12*(page-1)..<12*(page-1)+12 { if motionType == .table_tennis { //全部数据 let motionArray = MotionModel.getMotionByMonth((nowDate-i.months).date) if motionArray.count > 0 { totalMotions.append(contentsOf: motionArray) let motion = MotionRecord(isShow: false, motionArray: motionArray.reversed(), date: (nowDate-i.months).toString(.custom("yyyy-MM"))) motionList.append(motion) } } else { let motionArray = MotionModel.getMonthData(motionType.rawValue, date: (nowDate-i.months).date) // if 12-i == 10 || 12-i == 9 || 12-i == 8 || 12-i == 7 { // let t1 = MotionModel(type: .running, date: DateInRegion().date-100, length: 100, calorie: 200, distance: 300, steps: 500, altitude: 2) // let t2 = MotionModel(type: .steppers, date: DateInRegion().date-300.minutes, length: 66, calorie: 1000, distance: 300, steps: 500, altitude: 2) // let t3 = MotionModel(type: .steppers, date: DateInRegion().date+7.hours, length: 1000, calorie: 1000, distance: 300, steps: 500, altitude: 2) // motionArray = [t2, t1, t3] // } if motionArray.count > 0 { totalMotions.append(contentsOf: motionArray) let motion = MotionRecord(isShow: false, motionArray: motionArray.reversed(), date: (nowDate-i.months).toString(.custom("yyyy-MM"))) motionList.append(motion) } } } if motionList.count == 0 { // let motionArray = MotionModel.getMotionByMonth(nowDate.date) let motion = MotionRecord(isShow: false, motionArray: [], date: nowDate.toString(.custom("yyyy-MM"))) motionList.append(motion) } else { // motionList[0].isShow = true // tableView.reloadData() } // if motionList.count == 1 { // tableViewHeight.constant = 50 // } else { tableViewHeight.constant = CGFloat(60*motionList.count-10) // } self.tableView.reloadData() if totalMotions.count == 0 { return } if user.distanceUnit == 0 { if motionType == .mountaineering { if let maxAltitude = totalMotions.max(\.altitude)?.altitude { maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxAltitude)))" } if let maxDistance = totalMotions.max(\.distance)?.distance { maxTimeLabel.text = "\(String(format:"%.2f", Float(maxDistance)/1000))" } } else { if let maxDistance = totalMotions.max(\.distance)?.distance { maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxDistance)/1000))" } if let maxTime = totalMotions.max(\.length)?.length { maxTimeLabel.toTimeType3(length: maxTime) } } totalDistanceLabel.text = "\(String(format:"%.2f", Float(totalMotions.sum(\.distance))/1000))" } else { if motionType == .mountaineering { if let maxAltitude = totalMotions.max(\.altitude)?.altitude { maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxAltitude*3.281)))" } if let maxDistance = totalMotions.max(\.distance)?.distance { maxTimeLabel.text = "\(String(format:"%.2f", Float(maxDistance)*0.6213/1000))" } } else { if let maxDistance = totalMotions.max(\.distance)?.distance { maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxDistance)*0.6213/1000))" } if let maxTime = totalMotions.max(\.length)?.length { maxTimeLabel.toTimeType3(length: maxTime) } } totalDistanceLabel.text = "\(String(format:"%.2f", Float(totalMotions.sum(\.distance))*0.6213/1000))" } if let maxCalorie = totalMotions.max(\.calorie)?.calorie { maxCalorieLabel.text = "\(String(format:"%.2f", Float(maxCalorie)))" } // totalStepsLabel.text = "\(stepArray.sum(\.number))步" totalCalorieLabel.text = "\(String(format:"%.2f", Float(totalMotions.sum(\.calorie))))" totalTimeLabel.toTimeType3(length: totalMotions.sum(\.length)) totalNumberLabel.text = "\(totalMotions.count)" } private func reloadSectionCell(_ section: Int) { motionList[section].isShow = !motionList[section].isShow tableView.reloadSections(IndexSet.init(integer: section), with: .automatic) if motionList[section].isShow { tableViewHeight.constant += CGFloat(motionList[section].motionArray.count*50) } else { tableViewHeight.constant -= CGFloat(motionList[section].motionArray.count*50) } } } extension RecordDetailVC: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { if section == motionList.count-1 { return 0.1 } return 10 } func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { let footerView = UIView() footerView.backgroundColor = UIColor.rgbColorFromHex(0xF2F2F2) // print("???") return footerView } // func height func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 50 } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = RecordHeaderView(section: section, motion: motionList[section]) // headerView.backgroundColor = .red headerView.headerClosure = {[weak self] section in self?.reloadSectionCell(section) } return headerView } func numberOfSections(in tableView: UITableView) -> Int { return motionList.count } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 50 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return motionList[section].isShow ? motionList[section].motionArray.count : 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "MotionRecordCell", for: indexPath) as! MotionRecordCell cell.user = user if motionList[indexPath.section].isShow { cell.motion = motionList[indexPath.section].motionArray[indexPath.row] } return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let vc = UIStoryboard.loadViewControllerIdentifier(storyboardName: "Motion", identifier: "EndMotionVC") as! EndMotionVC vc.modalPresentationStyle = .fullScreen let motion = motionList[indexPath.section].motionArray[indexPath.row] var coordinateArray: [CLLocationCoordinate2D] = [] let coordinateStrArray = motion.coordinateArray.split(separator: "|") for coordinateStr in coordinateStrArray { let coordinateSub = String(coordinateStr).split(separator: ",") if coordinateSub.count == 2 { coordinateArray.append(CLLocationCoordinate2D(latitude: CLLocationDegrees(Float(coordinateSub[0])!), longitude: CLLocationDegrees(Float(coordinateSub[1])!))) } } var speedArray: [Float] = [] let speedStrArray = motion.speedArray for speed in speedStrArray.split(separator: "|") { speedArray.append(Float("\(speed)")!) } var stepCadenceArray: [Int] = [] let stepCadenceStrArray = motion.stepCadenceArray for stepCadence in stepCadenceStrArray.split(separator: "|") { stepCadenceArray.append(Int("\(stepCadence)")!) } var altitudeArray: [Double] = [] let altitudeStrArray = motion.altitudeArray for altitude in altitudeStrArray.split(separator: "|") { altitudeArray.append(Double("\(altitude)")!) } vc.coordinateArray = coordinateArray vc.calorie = motion.calorie vc.distance = Float(motion.distance) vc.length = motion.length vc.date = motion.date vc.speedArray = speedArray vc.isRecordPresent = true vc.motionType = motion.type! vc.stepCadenceArray = stepCadenceArray vc.altitudeArray = altitudeArray vc.altitude = motion.altitude self.present(vc, animated: true, completion: nil) } }