| | |
| | | // |
| | | // CommonDatePickerView.swift |
| | | // WanPai |
| | | // |
| | | // Created by 无故事王国 on 2023/6/27. |
| | | // |
| | | // |
| | | // CommonDatePickerView.swift |
| | | // WanPai |
| | | // |
| | | // Created by 无故事王国 on 2023/6/27. |
| | | // |
| | | |
| | | import UIKit |
| | | import JQTools |
| | | |
| | | class CommonDatePickerView: UIView,JQNibView{ |
| | | |
| | | enum DatePickerType{ |
| | | case YMD,YM,HHmm |
| | | } |
| | | enum DatePickerType{ |
| | | case YMD,YM,HHmm |
| | | } |
| | | |
| | | @IBOutlet weak var view_container: UIView! |
| | | @IBOutlet weak var cons_bottom: NSLayoutConstraint! |
| | | @IBOutlet weak var pickerView: UIPickerView! |
| | | private var type:DatePickerType! |
| | | @IBOutlet weak var view_container: UIView! |
| | | @IBOutlet weak var cons_bottom: NSLayoutConstraint! |
| | | @IBOutlet weak var pickerView: UIPickerView! |
| | | private var type:DatePickerType! |
| | | |
| | | private var years = [Int]() |
| | | private var months = [12,11,10,9,8,7,6,5,4,3,2,1] |
| | | private var hours = [Int]() |
| | | private var minutes = [Int]() |
| | | private var days = [Int]() |
| | | private var clouse:((Int?,Int?,Int?,Int?,Int?)->Void)? |
| | | private var years = [Int]() |
| | | private var months = [12,11,10,9,8,7,6,5,4,3,2,1] |
| | | private var hours = [Int]() |
| | | private var minutes = [Int]() |
| | | private var days = [Int]() |
| | | private var clouse:((Int?,Int?,Int?,Int?,Int?)->Void)? |
| | | |
| | | override func awakeFromNib() { |
| | | super.awakeFromNib() |
| | | cons_bottom.constant = -(JQ_ScreenW * 0.6974) |
| | | alpha = 0 |
| | | layoutIfNeeded() |
| | | pickerView.delegate = self |
| | | pickerView.dataSource = self |
| | | } |
| | | override func awakeFromNib() { |
| | | super.awakeFromNib() |
| | | cons_bottom.constant = -(JQ_ScreenW * 0.6974) |
| | | alpha = 0 |
| | | layoutIfNeeded() |
| | | pickerView.delegate = self |
| | | pickerView.dataSource = self |
| | | } |
| | | |
| | | |
| | | /// 初始化 |
| | | /// - Parameters: |
| | | /// - before: 向上N年 |
| | | /// - after: 向下N年 |
| | | /// - type: 显示状态 |
| | | static func show(before:Int = 0,after:Int = 0,type:DatePickerType = .YM,clouse:@escaping (Int?,Int?,Int?,Int?,Int?)->Void){ |
| | | let pickerView = CommonDatePickerView.jq_loadNibView() |
| | | pickerView.type = type |
| | | pickerView.clouse = clouse |
| | | /// 初始化 |
| | | /// - Parameters: |
| | | /// - before: 向上N年 |
| | | /// - after: 向下N年 |
| | | /// - type: 显示状态 |
| | | static func show(before:Int = 0,after:Int = 0,type:DatePickerType = .YM,clouse:@escaping (Int?,Int?,Int?,Int?,Int?)->Void){ |
| | | let pickerView = CommonDatePickerView.jq_loadNibView() |
| | | pickerView.type = type |
| | | pickerView.clouse = clouse |
| | | |
| | | |
| | | if type == .YM || type == .YMD{ |
| | | if before > 0{ |
| | | for i in 0...before{ |
| | | pickerView.years.append(Date().jq_nowYear() - i) |
| | | } |
| | | } |
| | | if type == .YM || type == .YMD{ |
| | | if before > 0{ |
| | | for i in 0...before{ |
| | | pickerView.years.append(Date().jq_nowYear() - i) |
| | | } |
| | | } |
| | | |
| | | if after > 0{ |
| | | for i in 0...after{ |
| | | pickerView.years.append(Date().jq_nowYear() + i) |
| | | } |
| | | } |
| | | } |
| | | if after > 0{ |
| | | for i in 0...after{ |
| | | pickerView.years.append(Date().jq_nowYear() + i) |
| | | } |
| | | } |
| | | } |
| | | |
| | | if type == .HHmm{ |
| | | for i in 0...24{ |
| | | pickerView.hours.append(i) |
| | | } |
| | | if type == .HHmm{ |
| | | for i in 0...24{ |
| | | pickerView.hours.append(i) |
| | | } |
| | | |
| | | for i in 0...59{ |
| | | pickerView.minutes.append(i) |
| | | } |
| | | } |
| | | for i in 0...59{ |
| | | pickerView.minutes.append(i) |
| | | } |
| | | } |
| | | |
| | | pickerView.frame = sceneDelegate?.window?.frame ?? .zero |
| | | sceneDelegate?.window?.addSubview(pickerView) |
| | | |
| | | pickerView.cons_bottom.constant = 0 |
| | | UIView.animate(withDuration: 0.4) { |
| | | pickerView.alpha = 1 |
| | | pickerView.layoutIfNeeded() |
| | | } |
| | | |
| | | pickerView.pickerView.reloadAllComponents() |
| | | } |
| | | |
| | | @IBAction func hiddenAction(_ sender: UIButton) { |
| | | cons_bottom.constant = -(JQ_ScreenW * 0.6974) |
| | | UIView.animate(withDuration: 0.4) { |
| | | self.alpha = 0 |
| | | self.layoutIfNeeded() |
| | | } completion: { _ in |
| | | self.removeFromSuperview() |
| | | } |
| | | } |
| | | |
| | | @IBAction func completeAction(_ sender: UIButton) { |
| | | |
| | | |
| | | pickerView.frame = sceneDelegate?.window?.frame ?? .zero |
| | | sceneDelegate?.window?.addSubview(pickerView) |
| | | var year:Int? |
| | | var month:Int? |
| | | var day:Int? |
| | | var hour:Int? |
| | | var minute:Int? |
| | | |
| | | pickerView.cons_bottom.constant = 0 |
| | | UIView.animate(withDuration: 0.4) { |
| | | pickerView.alpha = 1 |
| | | pickerView.layoutIfNeeded() |
| | | } |
| | | switch type{ |
| | | case .YMD: |
| | | year = years[pickerView.selectedRow(inComponent: 0)] |
| | | if year == Date().jq_nowYear(){ |
| | | month = months[pickerView.selectedRow(inComponent: 1)] - (12 - Date().jq_nowMonth()) |
| | | }else{ |
| | | month = months[pickerView.selectedRow(inComponent: 1)] |
| | | } |
| | | day = pickerView.selectedRow(inComponent: 2) + 1 |
| | | case .YM: |
| | | year = years[pickerView.selectedRow(inComponent: 0)] |
| | | if year == Date().jq_nowYear(){ |
| | | month = months[pickerView.selectedRow(inComponent: 1)] - (12 - Date().jq_nowMonth()) |
| | | }else{ |
| | | month = months[pickerView.selectedRow(inComponent: 1)] |
| | | } |
| | | case .HHmm: |
| | | hour = hours[pickerView.selectedRow(inComponent: 0)] |
| | | minute = minutes[pickerView.selectedRow(inComponent: 1)] |
| | | case .none:break |
| | | } |
| | | |
| | | pickerView.pickerView.reloadAllComponents() |
| | | } |
| | | |
| | | @IBAction func hiddenAction(_ sender: UIButton) { |
| | | cons_bottom.constant = -(JQ_ScreenW * 0.6974) |
| | | UIView.animate(withDuration: 0.4) { |
| | | self.alpha = 0 |
| | | self.layoutIfNeeded() |
| | | } completion: { _ in |
| | | self.removeFromSuperview() |
| | | } |
| | | } |
| | | |
| | | @IBAction func completeAction(_ sender: UIButton) { |
| | | |
| | | |
| | | var year:Int? |
| | | var month:Int? |
| | | var day:Int? |
| | | var hour:Int? |
| | | var minute:Int? |
| | | |
| | | switch type{ |
| | | case .YMD: |
| | | year = years[pickerView.selectedRow(inComponent: 0)] |
| | | month = months[pickerView.selectedRow(inComponent: 1)] |
| | | day = pickerView.selectedRow(inComponent: 2) + 1 |
| | | case .YM: |
| | | year = years[pickerView.selectedRow(inComponent: 0)] |
| | | month = months[pickerView.selectedRow(inComponent: 1)] |
| | | case .HHmm: |
| | | hour = hours[pickerView.selectedRow(inComponent: 0)] |
| | | minute = minutes[pickerView.selectedRow(inComponent: 1)] |
| | | case .none:break |
| | | } |
| | | |
| | | cons_bottom.constant = -(JQ_ScreenW * 0.6974) |
| | | UIView.animate(withDuration: 0.4) { |
| | | self.alpha = 0 |
| | | self.layoutIfNeeded() |
| | | } completion: { _ in |
| | | self.removeFromSuperview() |
| | | self.clouse?(year,month,day,hour,minute) |
| | | } |
| | | } |
| | | cons_bottom.constant = -(JQ_ScreenW * 0.6974) |
| | | UIView.animate(withDuration: 0.4) { |
| | | self.alpha = 0 |
| | | self.layoutIfNeeded() |
| | | } completion: { _ in |
| | | self.removeFromSuperview() |
| | | self.clouse?(year,month,day,hour,minute) |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | override func layoutSubviews() { |
| | | super.layoutSubviews() |
| | | view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 20) |
| | | } |
| | | override func layoutSubviews() { |
| | | super.layoutSubviews() |
| | | view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 20) |
| | | } |
| | | } |
| | | |
| | | extension CommonDatePickerView:UIPickerViewDelegate{ |
| | | func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { |
| | | if component == 0{ |
| | | pickerView.reloadComponent(1) |
| | | if type == .YMD{pickerView.reloadComponent(2)} |
| | | } |
| | | if component == 1{ |
| | | if type == .YMD{pickerView.reloadComponent(2)} |
| | | } |
| | | } |
| | | func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { |
| | | if component == 0{ |
| | | pickerView.reloadComponent(1) |
| | | if type == .YMD{pickerView.reloadComponent(2)} |
| | | } |
| | | if component == 1{ |
| | | if type == .YMD{pickerView.reloadComponent(2)} |
| | | } |
| | | } |
| | | } |
| | | |
| | | extension CommonDatePickerView:UIPickerViewDataSource{ |
| | | func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { |
| | | func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { |
| | | |
| | | if component == 0{ |
| | | switch type{ |
| | | case .YM,.YMD:return years.count |
| | | case .HHmm:return hours.count |
| | | case .none:return 0 |
| | | } |
| | | } |
| | | if component == 0{ |
| | | switch type{ |
| | | case .YM,.YMD:return years.count |
| | | case .HHmm:return hours.count |
| | | case .none:return 0 |
| | | } |
| | | } |
| | | |
| | | if component == 1{ |
| | | switch type{ |
| | | case .YM,.YMD: |
| | | if component == 1 && pickerView.selectedRow(inComponent: 0) == 0{ |
| | | return Date().jq_nowMonth() |
| | | } |
| | | return months.count |
| | | case .HHmm: |
| | | return minutes.count |
| | | case .none: |
| | | return 0 |
| | | } |
| | | } |
| | | if component == 1{ |
| | | switch type{ |
| | | case .YM,.YMD: |
| | | if component == 1 && pickerView.selectedRow(inComponent: 0) == 0{ |
| | | return Date().jq_nowMonth() |
| | | } |
| | | return months.count |
| | | case .HHmm: |
| | | return minutes.count |
| | | case .none: |
| | | return 0 |
| | | } |
| | | } |
| | | |
| | | if component == 2{ |
| | | switch type{ |
| | | case .YMD: |
| | | let year = years[pickerView.selectedRow(inComponent: 0)] |
| | | let month = months[pickerView.selectedRow(inComponent: 1)] |
| | | if component == 2{ |
| | | switch type{ |
| | | case .YMD: |
| | | let year = years[pickerView.selectedRow(inComponent: 0)] |
| | | let month = months[pickerView.selectedRow(inComponent: 1)] |
| | | |
| | | if year == Date().jq_nowYear() && month == Date().jq_nowMonth(){ |
| | | return Date().jq_nowDay() |
| | | }else{ |
| | | return Date.jq_getDays(year, month) |
| | | } |
| | | default:return 0 |
| | | } |
| | | } |
| | | if year == Date().jq_nowYear() && month == Date().jq_nowMonth(){ |
| | | return Date().jq_nowDay() |
| | | }else{ |
| | | return Date.jq_getDays(year, month) |
| | | } |
| | | default:return 0 |
| | | } |
| | | } |
| | | |
| | | return 0 |
| | | } |
| | | return 0 |
| | | } |
| | | |
| | | func numberOfComponents(in pickerView: UIPickerView) -> Int { |
| | | switch type{ |
| | | case .YM,.HHmm:return 2 |
| | | case .YMD:return 3 |
| | | case .none:return 0 |
| | | } |
| | | } |
| | | func numberOfComponents(in pickerView: UIPickerView) -> Int { |
| | | switch type{ |
| | | case .YM,.HHmm:return 2 |
| | | case .YMD:return 3 |
| | | case .none:return 0 |
| | | } |
| | | } |
| | | |
| | | func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { |
| | | return 55 |
| | | } |
| | | func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { |
| | | return 55 |
| | | } |
| | | |
| | | func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { |
| | | if component == 0{ |
| | | switch type{ |
| | | case .YM,.YMD:return "\(years[row])年" |
| | | case .HHmm:return String(format: "%02ld时", hours[row]) |
| | | default:return nil |
| | | } |
| | | } |
| | | func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { |
| | | if component == 0{ |
| | | switch type{ |
| | | case .YM,.YMD:return "\(years[row])年" |
| | | case .HHmm:return String(format: "%02ld时", hours[row]) |
| | | default:return nil |
| | | } |
| | | } |
| | | |
| | | if component == 1{ |
| | | switch type{ |
| | | case .YM,.YMD:return "\(months[row])月" |
| | | case .HHmm:return String(format: "%02ld分", minutes[row]) |
| | | default:return nil |
| | | } |
| | | } |
| | | if component == 1{ |
| | | switch type{ |
| | | case .YM,.YMD: |
| | | if pickerView.selectedRow(inComponent: 0) == 0{ |
| | | return "\(11 - Date().jq_nowMonth() - row - 1)月" |
| | | } |
| | | return "\(months[row])月" |
| | | case .HHmm:return String(format: "%02ld分", minutes[row]) |
| | | default:return nil |
| | | } |
| | | } |
| | | |
| | | if component == 2{ |
| | | switch type{ |
| | | case .YMD:return "\(row + 1)日" |
| | | default:return nil |
| | | } |
| | | } |
| | | if component == 2{ |
| | | switch type{ |
| | | case .YMD:return "\(row + 1)日" |
| | | default:return nil |
| | | } |
| | | } |
| | | |
| | | return nil |
| | | } |
| | | return nil |
| | | } |
| | | } |