//
|
// BitrhdayPickerView.swift
|
// JKFitness
|
//
|
// Created by 无故事王国 on 2024/2/20.
|
//
|
|
import UIKit
|
import JQTools
|
|
class BitrhdayPickerView: UIView {
|
|
enum DateType {
|
case YMD
|
case YM
|
}
|
|
private var view_content:UIView = {
|
let v = UIView()
|
v.backgroundColor = .white
|
return v
|
}()
|
|
private var label_title:UILabel = {
|
let label = UILabel()
|
label.font = .systemFont(ofSize: 18, weight: .medium)
|
label.textColor = .black.withAlphaComponent(0.8)
|
return label
|
}()
|
|
private var btn_close:UIButton = {
|
let btn = UIButton(type: .custom)
|
btn.setImage(UIImage(named: "btn_close_circle"), for: .normal)
|
return btn
|
}()
|
|
private var btn_complete:UIButton = {
|
let btn = UIButton(type: .custom)
|
btn.setTitle("确认", for: .normal)
|
btn.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .medium)
|
btn.setTitleColor(.white, for: .normal)
|
btn.backgroundColor = Config.ThemeColor
|
btn.jq_cornerRadius = 8
|
return btn
|
}()
|
|
|
private var picker:UIPickerView = {
|
let pickerView = UIPickerView()
|
return pickerView
|
}()
|
|
|
private var minYear:Int = 1960
|
private var maxYear:Int = Date().jq_nowYear() + 1
|
private var defaultYear:Int?
|
private var defaultMonth:Int?
|
private var defaultDay:Int?
|
private var resultValue:Double = 0
|
private var type:DateType!
|
private var clouse:((Date)->Void)!
|
|
override init(frame: CGRect) {
|
super.init(frame: frame)
|
backgroundColor = UIColor.black.withAlphaComponent(0)
|
addSubview(view_content)
|
view_content.snp.makeConstraints { make in
|
make.left.right.equalToSuperview()
|
make.bottom.equalToSuperview().offset(JQ_ScreenW * 0.3278)
|
make.height.equalTo(JQ_ScreenW * 0.3278)
|
}
|
|
|
view_content.addSubview(btn_close)
|
btn_close.addTarget(self, action: #selector(closeAction), for: .touchUpInside)
|
btn_close.snp.makeConstraints { make in
|
make.top.equalTo(10)
|
make.right.equalTo(-11)
|
make.width.height.equalTo(23)
|
}
|
|
view_content.addSubview(label_title)
|
label_title.snp.makeConstraints { make in
|
make.top.equalTo(30)
|
make.centerX.equalToSuperview()
|
make.height.equalTo(18)
|
}
|
|
layoutIfNeeded()
|
}
|
|
private func setUI(){
|
var items = Array<String>()
|
if type == .YMD{
|
items = ["年","月","日"]
|
}else{
|
items = ["年","月"]
|
}
|
|
let stackView = UIStackView()
|
stackView.axis = .horizontal
|
stackView.distribution = .fillEqually
|
stackView.spacing = 113
|
view_content.addSubview(stackView)
|
stackView.snp.makeConstraints { make in
|
make.top.equalTo(label_title.snp.bottom).offset(27)
|
make.height.equalTo(25)
|
make.centerX.equalToSuperview()
|
}
|
|
for (_,v) in items.enumerated(){
|
let label = UILabel()
|
label.text = v
|
label.font = UIFont.systemFont(ofSize: 18, weight: .medium)
|
label.textColor = .black.withAlphaComponent(0.8)
|
label.textAlignment = .center
|
stackView.addArrangedSubview(label)
|
}
|
|
view_content.addSubview(btn_complete)
|
btn_complete.snp.makeConstraints { make in
|
make.bottom.equalToSuperview().offset(-UIDevice.jq_safeEdges.bottom)
|
make.centerX.equalToSuperview()
|
make.width.equalTo(JQ_ScreenW * 0.1487)
|
make.height.equalTo(47)
|
}
|
|
view_content.addSubview(picker)
|
picker.delegate = self
|
picker.dataSource = self
|
picker.snp.makeConstraints { make in
|
make.top.equalTo(label_title.snp.bottom).offset(50)
|
make.bottom.equalTo(btn_complete.snp.top)
|
make.centerX.equalToSuperview()
|
}
|
|
btn_complete.addTarget(self, action: #selector(completeAction), for: .touchUpInside)
|
}
|
|
required init?(coder: NSCoder) {
|
fatalError("init(coder:) has not been implemented")
|
}
|
|
static func show(title:String,type:DateType,defaultYear:Int? = nil,defaultMonth:Int? = nil,defaultDay:Int? = nil,minYear:Int = 1960,clouse:@escaping (Date)->Void){
|
let pickerView = BitrhdayPickerView(frame: sceneDelegate?.window?.frame ?? .zero)
|
pickerView.minYear = minYear
|
pickerView.clouse = clouse
|
pickerView.label_title.text = title
|
pickerView.defaultYear = defaultYear
|
pickerView.defaultMonth = defaultMonth
|
pickerView.defaultDay = defaultDay
|
pickerView.type = type
|
sceneDelegate?.window?.addSubview(pickerView)
|
pickerView.setUI()
|
|
UIView.animate(withDuration: 0.35) {
|
pickerView.backgroundColor = UIColor.black.withAlphaComponent(0.7)
|
pickerView.view_content.snp.updateConstraints { make in
|
make.bottom.equalToSuperview()
|
}
|
pickerView.layoutIfNeeded()
|
}completion: { _ in
|
pickerView.picker.reloadAllComponents()
|
|
switch type {
|
case .YMD:
|
if defaultDay != nil{
|
pickerView.picker.selectRow(defaultDay! - 1, inComponent: 2, animated: true)
|
}
|
fallthrough
|
case .YM:
|
if defaultYear != nil{
|
pickerView.picker.selectRow(defaultYear! - pickerView.minYear, inComponent: 0, animated: true)
|
}
|
if defaultMonth != nil{
|
pickerView.picker.selectRow(defaultMonth! - 1, inComponent: 1, animated: true)
|
}
|
}
|
pickerView.picker.reloadAllComponents()
|
}
|
}
|
|
@objc func closeAction(){
|
UIView.animate(withDuration: 0.35) {
|
self.backgroundColor = UIColor.black.withAlphaComponent(0)
|
self.view_content.snp.updateConstraints { make in
|
make.bottom.equalToSuperview().offset(JQ_ScreenW * 0.3278)
|
}
|
self.layoutIfNeeded()
|
}completion: { _ in
|
self.removeFromSuperview()
|
}
|
}
|
|
@objc func completeAction(){
|
let year = picker.selectedRow(inComponent: 0) + minYear
|
let month = picker.selectedRow(inComponent: 1) + 1
|
|
var day = 1
|
if type == .YMD{
|
day = picker.selectedRow(inComponent: 2) + 1
|
}
|
|
clouse(Date.jq_format(year: year, month: month, day: day,hour: 0,minute: 0,second: 0)!)
|
closeAction()
|
}
|
}
|
|
extension BitrhdayPickerView:UIPickerViewDelegate & UIPickerViewDataSource{
|
func numberOfComponents(in pickerView: UIPickerView) -> Int {
|
if type == .YMD{
|
return 3
|
}
|
if type == .YM{
|
return 2
|
}
|
return 0
|
}
|
|
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
|
return 40
|
}
|
|
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
|
|
var resultLabel:UILabel?
|
if let label = view as? UILabel{
|
resultLabel = label
|
}else{
|
resultLabel = UILabel()
|
resultLabel!.font = UIFont.systemFont(ofSize: 18, weight: .semibold)
|
resultLabel!.textColor = UIColor(hexStr: "#3C3C3C")
|
resultLabel!.textAlignment = .center
|
}
|
|
if component == 0{
|
resultLabel!.text = "\(minYear + row)"
|
}
|
|
if component == 1{
|
resultLabel!.text = String(format: "%02ld", row + 1)
|
}
|
|
if component == 2{
|
|
resultLabel!.text = String(format: "%02ld", row + 1)
|
}
|
|
return resultLabel!
|
}
|
|
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
|
if component == 0{
|
return maxYear - minYear
|
}
|
|
if component == 1{
|
if pickerView.selectedRow(inComponent: 0) + minYear == Date().jq_nowYear(){
|
return Date().jq_nowMonth()
|
}
|
return 12
|
}
|
|
if component == 2{
|
if pickerView.selectedRow(inComponent: 0) + minYear == Date().jq_nowYear() && pickerView.selectedRow(inComponent: 1) + 1 == Date().jq_nowMonth(){
|
return Date().jq_nowDay()
|
}
|
return Date.jq_getDays(pickerView.selectedRow(inComponent: 0) + minYear, pickerView.selectedRow(inComponent: 1) + 1)
|
}
|
|
return 0
|
}
|
|
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 && type == .YMD{
|
pickerView.reloadComponent(2)
|
}
|
}
|
}
|