// // DateSwitchHeaderView.swift // HPlusFit // // Created by lemo. on 2019/9/17. // Copyright © 2019 lemo. All rights reserved. // import UIKit enum HPSegControlType { case day case week case month } typealias SegControlValueChangeClosure = (HPSegControlType) -> Void typealias DateSeletedClosure = (String) -> Void class DateSwitchHeaderView: UIView { var segControl: DateSegmentView! var dateSelectedView: DateSelectView! var segControlType: HPSegControlType = .day var segControlValueChangeClosure: SegControlValueChangeClosure? var dateSelectedClosure: DateSeletedClosure? var selectedDateStr: String = "" override init(frame: CGRect) { super.init(frame: frame) let segBackView = UIView(frame: CGRect(x: 0, y: 0, width: self.width, height: kScaleHeight(45.0))) segBackView.backgroundColor = UIColor.white self.addSubview(segBackView) //创建segment组件 segControl = DateSegmentView(frame: CGRect.init(x: 0, y: kScaleHeight(15), width: kScaleWidth(258), height: kScaleWidth(30))) segControl.centerX = segBackView.center.x segControl.titles = ["日".localized, "周".localized, "月".localized]; segControl.selectedClosure = { [weak self] index in guard let `self` = self else { return } self.segControlValueChange(index: index) } segBackView.addSubview(segControl) //创建日期选择组件 dateSelectedView = DateSelectView(frame: CGRect(x: 0, y: segBackView.height, width: self.width, height: self.height - segBackView.height)) dateSelectedView.backgroundColor = UIColor.white dateSelectedView.dateStr = DateClass.todayString().pregReplace(pattern: "-", with: "/") dateSelectedView.dateSelectClosure = { [weak self] (dateStr, isforward) in guard let `self` = self else { return } self.dateSelectChange(dateStr: dateStr, isforward: isforward) } self.addSubview(dateSelectedView) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } fileprivate func segControlValueChange(index: Int) { if index == 0 { segControlType = .day let dateFormat = DateFormatter() dateFormat.dateFormat = "yyyy/MM/dd" self.dateSelectedView.dateStr = dateFormat.string(from: Date()) }else if index == 1 { segControlType = .week self.dateSelectedView.dateStr = DateClass.todayString().weekRegion() }else { segControlType = .month let monthStr = DateClass.todayString().monthRegion().prefix(7) self.dateSelectedView.dateStr = monthStr.description } if let segControlClosure = self.segControlValueChangeClosure { segControlClosure(segControlType) } } fileprivate func dateSelectChange(dateStr: String, isforward: Bool) { if segControlType == .day { let dateString = dateStr.pregReplace(pattern: "/", with: "-") selectedDateStr = isforward ? DateClass.dateStringOffset(from: dateString, offset: 1) : DateClass.dateStringOffset(from: dateString, offset: -1) if selectedDateStr > DateClass.todayString() { SVProgressHUD.showInfo(withStatus: "该日期还没到呢!".localized) return } if selectedDateStr < "2019-01-01" { SVProgressHUD.showInfo(withStatus: "日期不能再往前了!".localized) return } self.dateSelectedView.dateStr = selectedDateStr.pregReplace(pattern: "-", with: "/") } if segControlType == .week { var dateString = "" let weekRegionComps = dateStr.components(separatedBy: "-") if weekRegionComps.count == 2 { selectedDateStr = "" if isforward { //下一周 let nextDateStr = weekRegionComps[1].pregReplace(pattern: "/", with: "-") selectedDateStr = DateClass.dateStringOffset(from: nextDateStr, offset: 1) if selectedDateStr > DateClass.todayString() { SVProgressHUD.showInfo(withStatus: "该日期还没到呢!".localized) return } }else { //前一周 let lastDateStr = weekRegionComps[0].pregReplace(pattern: "/", with: "-") selectedDateStr = DateClass.dateStringOffset(from: lastDateStr, offset: -7) if selectedDateStr < "2019-01-01" { SVProgressHUD.showInfo(withStatus: "日期不能再往前了!".localized) return } } dateString = selectedDateStr.weekRegion() } self.dateSelectedView.dateStr = dateString } if segControlType == .month { var dateString = "" selectedDateStr = "" let monthComps = dateStr.components(separatedBy: "/") let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" if monthComps.count == 2 { let year = (monthComps[0] as NSString).integerValue let month = (monthComps[1] as NSString).integerValue if isforward { //下个月 let monthEnd = DateClass.endOfMonth(year: year, month: month) let nextDateStr = dateFormatter.string(from: monthEnd) selectedDateStr = DateClass.dateStringOffset(from: nextDateStr, offset: 1) if selectedDateStr > DateClass.todayString() { SVProgressHUD.showInfo(withStatus: "该日期还没到呢!".localized) return } }else { //上个月 let monthStart = DateClass.startOfMonth(year: year, month: month) let lastDateStr = dateFormatter.string(from: monthStart) selectedDateStr = DateClass.dateStringOffset(from: lastDateStr, offset: -1) if selectedDateStr < "2019-01-01" { SVProgressHUD.showInfo(withStatus: "日期不能再往前了!".localized) return } } dateString = selectedDateStr.monthRegion() } self.dateSelectedView.dateStr = dateString.prefix(7).description } if let dateSelectedClosure = self.dateSelectedClosure { dateSelectedClosure(selectedDateStr) } } /// 外部调用切换日期 func switchDate(isforward: Bool) { if isforward { dateSelectedView.forwardAction() return } dateSelectedView.backwardAction() } /// 是否允许向前或者向后滚动日期 /// /// - Returns: isEnable func isforwardEnable(isforward: Bool) -> Bool { let dateStr = dateSelectedView.dateStr! switch segControlType { case .day: let dateString = dateStr.pregReplace(pattern: "/", with: "-") let selectedDateStr = isforward ? DateClass.dateStringOffset(from: dateString, offset: 1) : DateClass.dateStringOffset(from: dateString, offset: -1) if selectedDateStr > DateClass.todayString() { SVProgressHUD.showInfo(withStatus: "该日期还没到呢!".localized) return false } if selectedDateStr < "2019-01-01" { SVProgressHUD.showInfo(withStatus: "日期不能再往前了!".localized) return false } return true case .week: let weekRegionComps = dateStr.components(separatedBy: "-") if weekRegionComps.count == 2 { if isforward { //下一周 let nextDateStr = weekRegionComps[1].pregReplace(pattern: "/", with: "-") let selectedDateStr = DateClass.dateStringOffset(from: nextDateStr, offset: 1) if selectedDateStr > DateClass.todayString() { SVProgressHUD.showInfo(withStatus: "该日期还没到呢!".localized) return false } }else { //前一周 let lastDateStr = weekRegionComps[0].pregReplace(pattern: "/", with: "-") let selectedDateStr = DateClass.dateStringOffset(from: lastDateStr, offset: -7) if selectedDateStr < "2019-01-01" { SVProgressHUD.showInfo(withStatus: "日期不能再往前了!".localized) return false } } } return true case .month: let monthComps = dateStr.components(separatedBy: "/") let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" if monthComps.count == 2 { let year = (monthComps[0] as NSString).integerValue let month = (monthComps[1] as NSString).integerValue if isforward { //下个月 let monthEnd = DateClass.endOfMonth(year: year, month: month) let nextDateStr = dateFormatter.string(from: monthEnd) let selectedDateStr = DateClass.dateStringOffset(from: nextDateStr, offset: 1) if selectedDateStr > DateClass.todayString() { SVProgressHUD.showInfo(withStatus: "该日期还没到呢!".localized) return false } }else { //上个月 let monthStart = DateClass.startOfMonth(year: year, month: month) let lastDateStr = dateFormatter.string(from: monthStart) let selectedDateStr = DateClass.dateStringOffset(from: lastDateStr, offset: -1) if selectedDateStr < "2019-01-01" { SVProgressHUD.showInfo(withStatus: "日期不能再往前了!".localized) return false } } } return true } } }