//
|
// CityAddressPickerView.swift
|
// DolphinEnglishLearnStudent
|
//
|
// Created by 无故事王国 on 2024/6/3.
|
//
|
|
import UIKit
|
import RxSwift
|
|
class CityAddressPickerView: UIView {
|
|
private var disposeBag = DisposeBag()
|
private var items = [AddressTreeModel]()
|
private var clouse:((AddressTreeModel?,AddressTreeModel?,AddressTreeModel?)->Void)!
|
|
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
|
}()
|
|
|
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(){
|
|
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(316)
|
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()
|
make.width.equalTo(350)
|
}
|
|
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,clouse:@escaping (AddressTreeModel?,AddressTreeModel?,AddressTreeModel?)->Void){
|
let pickerView = CityAddressPickerView(frame: sceneDelegate?.window?.frame ?? .zero)
|
pickerView.clouse = clouse
|
sceneDelegate?.window?.addSubview(pickerView)
|
pickerView.setUI()
|
pickerView.label_title.text = title
|
|
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
|
Services.addressTree().subscribe(onNext: {data in
|
if let datas = data.data{
|
pickerView.items = datas
|
pickerView.picker.reloadAllComponents()
|
}
|
}).disposed(by: pickerView.disposeBag)
|
}
|
}
|
|
@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 provinceIndex = picker.selectedRow(inComponent: 0)
|
let provinceModel = items[provinceIndex]
|
let cityModel = items[provinceIndex].children?[picker.selectedRow(inComponent: 1)]
|
let countryModel = items[provinceIndex].children?[picker.selectedRow(inComponent: 1)].children?[picker.selectedRow(inComponent: 2)]
|
clouse(provinceModel,cityModel,countryModel)
|
closeAction()
|
}
|
}
|
|
extension CityAddressPickerView:UIPickerViewDelegate & UIPickerViewDataSource{
|
func numberOfComponents(in pickerView: UIPickerView) -> Int {
|
if items.count > 0{
|
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
|
resultLabel!.adjustsFontSizeToFitWidth = true
|
}
|
|
if component == 0{
|
resultLabel!.text = items[row].name
|
}
|
|
if component == 1{
|
let v = items[pickerView.selectedRow(inComponent: 0)]
|
resultLabel!.text = v.children?[row].name ?? ""
|
}
|
|
if component == 2{
|
let v = items[pickerView.selectedRow(inComponent: 0)]
|
let v1 = v.children?[pickerView.selectedRow(inComponent: 1)]
|
resultLabel!.text = v1?.children?[row].name ?? ""
|
}
|
|
return resultLabel!
|
}
|
|
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
|
if component == 0 {
|
return items.count
|
}
|
|
if component == 1{
|
let index = pickerView.selectedRow(inComponent: 0)
|
return items[index].children?.count ?? 0
|
}
|
|
if component == 2{
|
let indexI = pickerView.selectedRow(inComponent: 0)
|
let indexJ = pickerView.selectedRow(inComponent: 1)
|
return items[indexI].children?[indexJ].children?.count ?? 0
|
}
|
|
return 0
|
}
|
|
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
|
if component == 0{
|
pickerView.reloadComponent(1)
|
}
|
|
if component == 1{
|
|
}
|
}
|
}
|