美文网首页
swift 城市选择三级联动选择器

swift 城市选择三级联动选择器

作者: WindFeng | 来源:发表于2016-08-24 16:39 被阅读939次

    //项目

    import UIKit

    import SnapKit

    class ChangeHomeAddressVC: BaseViewController,UIPickerViewDelegate,UIPickerViewDataSource{

    var pickerDic:NSDictionary!

    var provinceArray:NSArray!

    var cityArray:NSArray!

    var townArray:NSArray!

    var selectedArray:NSArray!

    override func viewDidLoad() {

    super.viewDidLoad()

    self.navigationItem.title = "更改家庭地址"

    //右边导航键

    self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "保存", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(ChangeHomeAddressVC.changeAddressByPicker))

    prepareUI()

    addPickView()

    getPickerData()

    }

    //屏幕点击事件

    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {

    self.view.endEditing(true)

    }

    //点击了改变地址的view触发事件

    func changeAddress() {

    print("点击了改变地址的view")

    if cityPickView.frame.origin.y < UIScreen.mainScreen().bounds.height - 204{

    print("点击过了")

    }else {

    likeToolView.hidden = false

    cityPickView.hidden = false

    UIView.animateWithDuration(1.25, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: UIViewAnimationOptions(rawValue:0), animations: {

    self.likeToolView.transform = CGAffineTransformTranslate(self.likeToolView.transform, 0, -204)

    self.cityPickView.transform = CGAffineTransformTranslate(self.cityPickView.transform , 0, -204)

    }, completion: nil)

    }

    }

    //MARK:  -视图

    func prepareUI() {

    self.view.addSubview(topView)

    topView.addSubview(labelView)

    labelView.addSubview(addressLabel)

    labelView.addSubview(cityLabel)

    labelView.addSubview(districtLabel)

    topView.addSubview(fengGeLine)

    topView.addSubview(AddressTextField)

    labelView.snp_makeConstraints { (make) in

    make.trailing.equalTo(topView.snp_trailing)

    make.leading.equalTo(topView.snp_leading)

    make.top.equalTo(topView.snp_top)

    make.height.equalTo(44)

    }

    cityLabel.snp_makeConstraints { (make) in

    make.centerY.equalTo(addressLabel.snp_centerY)

    make.leading.equalTo(addressLabel.snp_trailing).offset(5)

    }

    districtLabel.snp_makeConstraints { (make) in

    make.centerY.equalTo(addressLabel.snp_centerY)

    make.leading.equalTo(cityLabel.snp_trailing).offset(5)

    }

    AddressTextField.snp_makeConstraints { (make) in

    make.top.equalTo(fengGeLine.snp_bottom).offset(20)

    make.leading.equalTo(fengGeLine.snp_leading)

    make.trailing.equalTo(fengGeLine.snp_trailing)

    }

    fengGeLine.snp_makeConstraints { (make) in

    make.top.equalTo(labelView.snp_bottom)

    make.leading.equalTo(self.view.snp_leading).offset(10)

    make.trailing.equalTo(self.view.snp_trailing).offset(-10)

    make.height.equalTo(1)

    }

    addressLabel.snp_makeConstraints { (make) in

    make.top.equalTo(labelView.snp_top).offset(15)

    make.leading.equalTo(labelView.snp_leading).offset(10)

    }

    topView.snp_makeConstraints { (make) in

    make.top.equalTo(self.view.snp_top).offset(10)

    make.leading.equalTo(self.view.snp_leading)

    make.trailing.equalTo(self.view.snp_trailing)

    make.height.equalTo(99)

    }

    }

    lazy var topView : UIView = {

    let view = UIView()

    view.backgroundColor = UIColor.whiteColor()

    return view

    }()

    lazy var labelView : UIView  = {

    let view = UIView()

    view.backgroundColor = UIColor.whiteColor()

    let addressLabelGesture = UITapGestureRecognizer.init(target: self, action: #selector(ChangeHomeAddressVC.changeAddress))

    view.addGestureRecognizer(addressLabelGesture)

    return view

    }()

    //省

    lazy var addressLabel : UILabel = {

    let label = UILabel()

    label.text = "省市区"

    label.font = UIFont.systemFontOfSize(14)

    label.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

    return label

    }()

    //市

    lazy var cityLabel : UILabel = {

    let label =  UILabel()

    label.text = " "

    label.font = UIFont.systemFontOfSize(14)

    label.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

    return label

    }()

    //区

    lazy var districtLabel : UILabel = {

    let label =  UILabel()

    label.text = " "

    label.font = UIFont.systemFontOfSize(14)

    label.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

    return label

    }()

    lazy var fengGeLine : UIView = {

    let line = UIView()

    line.backgroundColor = UIColor.init(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 1.0)

    return line

    }()

    lazy var AddressTextField : UITextField = {

    let text = UITextField()

    text.placeholder = "详细地址(请精确房门号)"

    text.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

    return text

    }()

    override func didReceiveMemoryWarning() {

    super.didReceiveMemoryWarning()

    // Dispose of any resources that can be recreated.

    }

    //MARK: -添加地址选择器

    func addPickView() {

    self.view.addSubview(likeToolView)

    likeToolView.addSubview(sureBtn)

    likeToolView.addSubview(topViewLine)

    likeToolView.addSubview(cancelBtn)

    self.view.addSubview(cityPickView)

    cityPickView.snp_makeConstraints { (make) in

    make.top.equalTo(likeToolView.snp_bottom)

    make.leading.equalTo(likeToolView.snp_leading)

    make.trailing.equalTo(likeToolView.snp_trailing)

    make.height.equalTo(160)

    }

    cancelBtn.snp_makeConstraints { (make) in

    make.centerY.equalTo(likeToolView.snp_centerY)

    make.leading.equalTo(likeToolView.snp_leading).offset(20)

    }

    sureBtn.snp_makeConstraints { (make) in

    make.centerY.equalTo(likeToolView.snp_centerY)

    make.trailing.equalTo(likeToolView.snp_trailing).offset(-20)

    }

    likeToolView.snp_makeConstraints { (make) in

    make.top.equalTo(self.view.snp_bottom)

    make.leading.equalTo(self.view.snp_leading)

    make.trailing.equalTo(self.view.snp_trailing)

    make.height.equalTo(44)

    }

    topViewLine.snp_makeConstraints { (make) in

    make.top.equalTo(likeToolView.snp_top)

    make.leading.equalTo(likeToolView.snp_leading)

    make.trailing.equalTo(likeToolView.snp_trailing)

    make.height.equalTo(1)

    }

    }

    lazy var likeToolView : UIView = {

    let view = UIView()

    //        view.backgroundColor = UIColor.init(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 1.0)

    view.backgroundColor = UIColor.whiteColor()

    return view

    }()

    lazy var sureBtn : UIButton = {

    let btn = UIButton()

    btn.setTitle("确定", forState: UIControlState.Normal)

    btn.setTitleColor(UIColor.init(r255: 41, g255: 196, b255: 117), forState: UIControlState.Normal)

    btn.addTarget(self, action: #selector(ChangeHomeAddressVC.sureClick), forControlEvents: UIControlEvents.TouchUpInside)

    btn.sizeToFit()

    return btn

    }()

    lazy var cancelBtn : UIButton = {

    let btn = UIButton()

    btn.setTitle("取消", forState: UIControlState.Normal)

    btn.setTitleColor(UIColor.init(r255: 165, g255: 165, b255: 165), forState: UIControlState.Normal)

    btn.addTarget(self, action: #selector(ChangeHomeAddressVC.cancelBtnClick), forControlEvents: UIControlEvents.TouchUpInside)

    return btn

    }()

    lazy var cityPickView : UIPickerView = {

    let view = UIPickerView()

    view.delegate = self

    view.dataSource = self

    //        view.backgroundColor = UIColor.yellowColor()

    return view

    }()

    lazy var topViewLine : UIView = {

    let view = UIView()

    view.backgroundColor = UIColor.init(r255: 165, g255: 165, b255: 165)

    return view

    }()

    //MARK: -pickerView

    func getSubViews(view:UIView) {

    for subView in view.subviews {

    if subView.subviews.count != 0 {

    self.getSubViews(subView)

    }else {

    if subView.frame.size.height <= 1 {

    subView.backgroundColor = UIColor.init(r255: 41, g255: 196, b255: 117)

    subView.alpha = 0.5

    }

    }

    }

    }

    func sureClick() {

    print("点击了确认按钮")

    UIView.animateWithDuration(1.25, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: UIViewAnimationOptions(rawValue:0), animations: {

    self.likeToolView.hidden = true

    self.cityPickView.hidden = true

    self.likeToolView.transform = CGAffineTransformIdentity

    self.cityPickView.transform = CGAffineTransformIdentity

    },completion: nil)

    }

    func cancelBtnClick() {

    print("点击了取消按钮")

    UIView.animateWithDuration(1.25, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: UIViewAnimationOptions(rawValue:0), animations: {

    self.addressLabel.text = "省市区"

    self.addressLabel.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

    }) { (_) in

    self.likeToolView.hidden = true

    self.cityPickView.hidden = true

    self.likeToolView.transform = CGAffineTransformIdentity

    self.cityPickView.transform = CGAffineTransformIdentity

    }

    }

    //解析plist文件

    func getPickerData(){

    let path = NSBundle.mainBundle().pathForResource("Address", ofType: "plist")

    self.pickerDic = NSDictionary.init(contentsOfFile: path!)

    self.provinceArray = self.pickerDic.allKeys

    self.selectedArray = self.pickerDic.objectForKey(self.pickerDic.allKeys[0]) as! NSArray

    if (self.selectedArray.count > 0){

    self.cityArray = self.selectedArray[0].allKeys

    }

    if (self.cityArray.count > 0){

    self.townArray = self.selectedArray[0].objectForKey(self.cityArray[0]) as! NSArray

    }

    }

    //MARK:-pickerView代理方法

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

    return 3

    }

    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {

    self.getSubViews(pickerView)

    var pickerLabel = UILabel()

    pickerLabel = UILabel.init()

    //        pickerLabel.font = UIFont(name: "Helvetica", size: 8)

    pickerLabel.font = UIFont.systemFontOfSize(16)

    pickerLabel.adjustsFontSizeToFitWidth = true

    pickerLabel.textAlignment = .Left

    pickerLabel.backgroundColor = UIColor.clearColor()

    pickerLabel.text = self.pickerView(pickerView, titleForRow: row, forComponent: component)

    return pickerLabel

    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    if (component == 0) {

    return self.provinceArray.count;

    } else if (component == 1) {

    return self.cityArray.count

    } else {

    return self.townArray.count

    }

    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    if (component == 0) {

    //return [self.provinceArray objectAtIndex:row];

    return self.provinceArray[row] as? String

    } else if (component == 1) {

    return self.cityArray[row] as? String;

    } else {

    return self.townArray[row] as? String;

    }

    }

    func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {

    if (component == 0) {

    return 110;

    } else if (component == 1) {

    return 100;

    } else {

    return 110;

    }

    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if (component == 0) {

    self.selectedArray = self.pickerDic.objectForKey(self.provinceArray[row]) as! NSArray

    if (self.selectedArray.count > 0) {

    self.cityArray = self.selectedArray[0].allKeys

    } else {

    self.cityArray = nil;

    }

    if (self.cityArray.count > 0) {

    self.townArray = self.selectedArray[0].objectForKey(self.cityArray[0]) as! NSArray

    } else {

    self.townArray = nil;

    }

    pickerView.selectRow(0, inComponent: 1, animated: true)

    }

    pickerView.selectedRowInComponent(1)

    pickerView.reloadComponent(1)

    pickerView.selectedRowInComponent(2)

    if (component == 1) {

    if (self.selectedArray.count > 0 && self.cityArray.count > 0) {

    self.townArray = self.selectedArray[0].objectForKey(self.cityArray[row]) as! NSArray

    } else {

    self.townArray = nil;

    }

    pickerView.selectRow(0, inComponent: 2, animated: true)

    }

    pickerView.reloadComponent(2)

    //        provinceBtn.setTitle(self.provinceArray[self.myPicker.selectedRowInComponent(0)] as? String, forState:.Normal)

    addressLabel.text = (self.provinceArray[self.cityPickView.selectedRowInComponent(0)] as? String)!

    cityLabel.text =  (self.cityArray[self.cityPickView.selectedRowInComponent(1)] as? String)!

    districtLabel.text =  (self.townArray[self.cityPickView.selectedRowInComponent(2)]as? String)!

    addressLabel.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

    cityLabel.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

    districtLabel.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

    }

    }

    效果图如下


    相关文章

      网友评论

          本文标题:swift 城市选择三级联动选择器

          本文链接:https://www.haomeiwen.com/subject/flcgrttx.html