无故事王国
2024-07-26 e6636384e031aab3c38710c5d996c2e0d54e8860
WanPai/Root/Other/View/CommonDatePickerView.swift
@@ -1,231 +1,242 @@
    //
    //  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
            }
}