// // DatePickerView.swift // Twear // // Created by yangbin on 2021/12/24. // import UIKit class ZCPickerView: UIView, UIPickerViewDelegate, UIPickerViewDataSource { typealias clickAlertClosure = (_ value: Int) -> Void var clickClosure: clickAlertClosure! private let bgView = UIView() //白色框 private lazy var titleLabel: UILabel = { let label = UILabel() label.font = RegularFont(20) label.textColor = UIColor .rgbColorFromHex(0x333333) label.textAlignment = .center return label }() private lazy var sureBtn: UIButton = { let button = UIButton() button.addTarget(self, action: #selector(clickBtnAction(_:)), for: .touchUpInside) button.layer.cornerRadius = 22 button.layer.masksToBounds = true button.backgroundColor = UIColor .rgbColorFromHex(0x24C789) button.setTitle(LocString("确定"), for: .normal) button.titleLabel?.font = BoldFont(17) button.tag = 1 return button }() private lazy var cancelBtn: UIButton = { let button = UIButton() button.addTarget(self, action: #selector(clickBtnAction(_:)), for: .touchUpInside) button.setImage(UIImage(named: "close"), for: .normal) button.tag = 2 return button }() var selectedRow: Int = 0 { didSet { pickerView.selectRow(self.selectedRow, inComponent: 0, animated: false) pickerView.reloadAllComponents() } } lazy var pickerView: UIPickerView = { let picker = UIPickerView() picker.delegate = self // picker.locale = .current // picker.addTarget(self, action: #selector(dateChanged(datePicker:)), for: .valueChanged) return picker }() private var suffix: String? private var titleColor: UIColor = UIColor.rgbColorFromHex(0x333333) private var values: [Int] = [] // { // didSet { // pickerView.reloadAllComponents() // } // } init(title: String, values: [Int], suffix: String? = nil, titleColor: UIColor = UIColor.rgbColorFromHex(0x333333), sureText: String = LocString("确定")) { super.init(frame: CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)) createView(title: title, values: values, suffix: suffix, titleColor: titleColor, sureText: sureText) } func createView(title: String, values: [Int], suffix: String? = nil, titleColor: UIColor, sureText: String) { self.backgroundColor = UIColor.black.withAlphaComponent(0.1) bgView.backgroundColor = .white self.titleColor = titleColor self.suffix = suffix self.values = values titleLabel.text = title sureBtn.setTitle(sureText, for: .normal) // pickerView.reloadAllComponents() addSubview(bgView) bgView.addSubview(titleLabel) bgView.addSubview(sureBtn) bgView.addSubview(cancelBtn) bgView.addSubview(pickerView) bgView.snp.makeConstraints { (make) in make.left.right.bottom.equalToSuperview() make.height.equalTo(340) } cancelBtn.snp.makeConstraints { make in make.height.equalTo(78) make.width.equalTo(58) make.right.top.equalToSuperview() } sureBtn.snp.makeConstraints { make in make.bottom.equalToSuperview().offset(-50) make.left.equalToSuperview().offset(60) make.right.equalToSuperview().offset(-60) make.height.equalTo(44) } titleLabel.snp.makeConstraints { make in make.centerX.equalToSuperview() make.centerY.equalTo(cancelBtn) } pickerView.snp.makeConstraints { make in make.top.equalTo(cancelBtn.snp_bottom) make.left.right.equalToSuperview() make.bottom.equalTo(sureBtn.snp_top) } bgView.layoutIfNeeded() bgView.setCorners(corners: [.topLeft, .topRight], radio: 12) } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return values.count } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if suffix == ":00" { return "\(String(format:"%02d",values[row])):00" } return "\(values[row])" } func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { var pickerLabel = view as? UILabel if pickerLabel == nil { pickerLabel = UILabel() pickerLabel?.font = RegularFont(16) pickerLabel?.textAlignment = .center pickerLabel?.textColor = UIColor.lightGray } if row == selectedRow { pickerLabel?.attributedText = self.pickerView(pickerView, attributedTitleForRow: selectedRow, forComponent: component) } else { pickerLabel?.text = self.pickerView(pickerView, titleForRow: row, forComponent: component) } return pickerLabel! } func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 30 } func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? { let str = "\(values[row])" var string = NSMutableAttributedString(string: "\(values[row])") if suffix != nil { if suffix == ":00" { string = NSMutableAttributedString(string: "\(String(format:"%02d",values[row])):00") string.addAttributes([.foregroundColor: titleColor, .font: RegularFont(23)], range: NSMakeRange(0, string.length)) } else { string = NSMutableAttributedString(string: " \(values[row]) \(suffix!)") string.addAttributes([.foregroundColor: titleColor, .font: BoldFont(16)], range: NSMakeRange(0, string.length-1)) string.addAttributes([.foregroundColor: titleColor, .font: BoldFont(20)], range: NSMakeRange(0, str.length+1)) string.addAttributes([.foregroundColor: titleColor, .font: BoldFont(16)], range: NSMakeRange(str.length+1, suffix!.length+1)) } } else { string.addAttributes([.foregroundColor: titleColor, .font: BoldFont(20)], range: NSMakeRange(0, str.length)) } return string } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { selectedRow = row pickerView.reloadAllComponents() } @objc func clickBtnAction(_ sender: UIButton) { if clickClosure != nil && sender.tag == 1 { clickClosure!(values[selectedRow]) } dismiss() } func show() { let wind = KeyWindow self.alpha = 0 wind.addSubview(self) UIView.animate(withDuration: 0.25, animations: { () -> Void in self.alpha = 1 }) } @objc func dismiss() { UIView.animate(withDuration: 0.25, animations: { () -> Void in self.alpha = 0 }, completion: { (finish) -> Void in if finish { self.removeFromSuperview() } }) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } /* // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func draw(_ rect: CGRect) { // Drawing code } */ }