ifish/Ifish/views/ChinaPlckerView/ChinaPlckerView.m

394 lines
14 KiB
Objective-C
Executable File

//
// ChinaPlckerView.m
// 地址选择器
//
// Created by zhuming on 16/2/15.
// Copyright © 2016年 zhuming. All rights reserved.
//
#import "ChinaPlckerView.h"
// 屏幕的高度
#define kScreenHeight [[UIScreen mainScreen] bounds].size.height
// 屏幕的宽度
#define kScreenWidth [[UIScreen mainScreen] bounds].size.width
//键盘高度 253
#define IT_KEYBOARD_HEIGHT 253
#define ROW_HEIGHT 40
//设置RGB颜色值
#define COLOR(R,G,B,A) [UIColor colorWithRed:(CGFloat)R/255.0 green:(CGFloat)G/255.0 blue:(CGFloat)B/255.0 alpha:A]
@interface ChinaPlckerView ()<UIPickerViewDataSource,UIPickerViewDelegate>
/**
* 地址选择器
*/
@property (nonatomic,strong)UIPickerView *pickerView;
/**
* 确定按钮
*/
@property (nonatomic,strong)UIButton *sureButton;
/**
* 蒙蔽曾
*/
@property (nonatomic,strong)UIView *hideView;
/**
* 选择器视图
*/
@property (nonatomic,strong)UIView *addPickVview;
/**
* 数据模型
*/
@property (nonatomic,strong)ChinaArea *chinaModel;
/**
* 选择的省份ID
*/
@property (nonatomic,strong)NSString *selectedProvinceID;
/**
* 选择的城市ID
*/
@property (nonatomic,strong)NSString *selectedCityID;
/**
* 选择的区域ID
*/
@property (nonatomic,strong)NSString *selectedAreaID;
@end
@implementation ChinaPlckerView
/**
* 添加城市选择器
*
* @param delegate 代理
* @param views 父视图
*
* @return 城市选择器
*/
+(ChinaPlckerView *)customChinaPicker:(id)delegate superView:(UIView*)views{
UIView *oldView = [views viewWithTag:0x123];
if ([oldView isKindOfClass:[ChinaPlckerView class]]) {
ChinaPlckerView *navView = (ChinaPlckerView *)oldView;
navView.delegate = delegate;
[navView showChinaPickerView];
return navView;
}
ChinaPlckerView *navView = [[ChinaPlckerView alloc] init];
navView.delegate = delegate;
[navView showChinaPickerView];
navView.tag = 0x123;
[views addSubview:navView];
return navView;
}
/**
* 重写父类的init方法
*
* @return self
*/
- (instancetype)init{
if (self = [super init]) {
[self initPickerView];
}
return self;
}
/**
* 确定按钮按下
*/
- (void)btnClick{
if ([_delegate respondsToSelector:@selector(chinaPlckerViewDelegateChinaModel:)]) {
[_delegate chinaPlckerViewDelegateChinaModel:self.chinaModel];
}
[self hideChinaPickerView];
}
/**
* 触摸屏幕其他地方收起选择器
*/
- (void)tapClick{
[self hideChinaPickerView];
}
/**
* 创建城市选择器
*/
- (void)initPickerView{
// 模型的初始化
self.chinaModel = [[ChinaArea alloc] init];
// 默认
self.selectedProvinceID = @"2"; // 北京市
self.selectedCityID = @"52"; // 北京市
self.selectedAreaID = @"500"; // 东城区
self.chinaModel.provinceModel = ((ProvinceModel *)[self.chinaModel getProvinceDataByID:self.selectedProvinceID]);
self.chinaModel.cityModel = ((CityModel *)[self.chinaModel getCityDataByID:self.selectedCityID]);
self.chinaModel.areaModel = ((AreaModel *)[self.chinaModel getAreaDataByID:self.selectedAreaID]);
// 初始化视图
self.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
self.userInteractionEnabled = YES;
self.hidden = YES;
self.backgroundColor = [UIColor clearColor];
// 蒙蔽层
self.hideView = [[UIView alloc] init];
self.hideView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
self.hideView.backgroundColor = COLOR(45, 47, 56, 0.0f);
[self addSubview:self.hideView];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapClick)];
[self.hideView addGestureRecognizer:tap];
//添加选择器
self.addPickVview = [[UIView alloc]init];
self.addPickVview.frame = CGRectMake(0, kScreenHeight - IT_KEYBOARD_HEIGHT, kScreenWidth, IT_KEYBOARD_HEIGHT);
self.addPickVview.backgroundColor = [UIColor whiteColor];
[self addSubview:self.addPickVview];
//确认按钮
CGFloat titleHeight = IT_KEYBOARD_HEIGHT - 216;
UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,kScreenWidth,titleHeight)];
//titleView.backgroundColor = [UIColor blueColor];
[self.addPickVview addSubview:titleView];
UIButton *sureBtn = [UIButton buttonWithType:UIButtonTypeCustom];
sureBtn.frame = CGRectMake(kScreenWidth - 70, 0, 60, titleHeight);
[sureBtn setTitle:@"确定" forState:UIControlStateNormal];
[sureBtn setTitle:@"确定" forState:UIControlStateHighlighted];
[sureBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[sureBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
[sureBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
[titleView addSubview:sureBtn];
// UIPickerView
UIPickerView *pickerView = [[UIPickerView alloc] init];
pickerView.frame = CGRectMake(0, CGRectGetMaxY(titleView.frame), kScreenWidth, 216);
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.backgroundColor = [UIColor whiteColor];
[self.addPickVview addSubview:pickerView];
self.pickerView = pickerView;
[self.pickerView selectRow:0 inComponent:0 animated:YES];
[self.pickerView selectRow:0 inComponent:1 animated:YES];
[self.pickerView selectRow:0 inComponent:2 animated:YES];
}
#pragma mark - UIPickerViewDataSource,UIPickerViewDelegate
/**
* 设置pickerView的列数
*
* @param pickerView pickerView description
*
* @return pickerView的列数
*/
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 3;
}
/**
* 设置每一列显示的数量
*
* @param pickerView pickerView description
* @param component 列
*
* @return 美列的数量
*/
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
if (component == 0) { // 省份
return [self.chinaModel getAllProvinceData].count;
}
else if (component == 1){ // 城市
return [self.chinaModel getCityDataByParentID:self.selectedProvinceID].count;
}
else{ // 区域
return [self.chinaModel getAreaDataByParentID:self.selectedCityID].count;
}
}
/**
* 设置每一列的宽度
*
* @param pickerView pickerView description
* @param component 列
*
* @return 每列的宽度
*/
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
return (kScreenWidth - 20)/3;
}
/**
* 设置每一行的高度
*
* @param pickerView pickerView description
* @param component 列
*
* @return 每一行的高度
*/
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
return ROW_HEIGHT;
}
/**
* 设置每一行的显示视图
*
* @param pickerView pickerView description
* @param row 每一类的row
* @param component 列
* @param view view description
*
* @return 每一列每一行的视图
*/
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
if (component == 0) { // 省份
if (!view) {
view = [[UIView alloc] init];
}
UILabel *textLabel = [[UILabel alloc] init];
textLabel.frame = CGRectMake(0, 0, (kScreenWidth - 20)/3, ROW_HEIGHT);
textLabel.textAlignment = NSTextAlignmentCenter;
textLabel.text = ((ProvinceModel *)[self.chinaModel getAllProvinceData][row]).NAME;
textLabel.font = [UIFont systemFontOfSize:14];
textLabel.textColor = COLOR(51, 51, 51, 1);
[view addSubview:textLabel];
return view;
}
else if (component == 1){ // 城市
if (!view) {
view = [[UIView alloc] init];
}
UILabel *textLabel = [[UILabel alloc] init];
textLabel.frame = CGRectMake(0, 0, (kScreenWidth - 20)/3, ROW_HEIGHT);
textLabel.textAlignment = NSTextAlignmentCenter;
textLabel.text = ((CityModel *)[self.chinaModel getCityDataByParentID:self.selectedProvinceID][row]).NAME;
textLabel.font = [UIFont systemFontOfSize:14];
textLabel.textColor = COLOR(51, 51, 51, 1);
[view addSubview:textLabel];
return view;
}
else{ // 区域
if (!view) {
view = [[UIView alloc] init];
}
UILabel *textLabel = [[UILabel alloc] init];
textLabel.frame = CGRectMake(0, 0, (kScreenWidth - 20)/3, ROW_HEIGHT);
textLabel.textAlignment = NSTextAlignmentCenter;
textLabel.text = ((AreaModel *)[self.chinaModel getAreaDataByParentID:self.selectedCityID][row]).NAME;
textLabel.font = [UIFont systemFontOfSize:14];
textLabel.textColor = COLOR(51, 51, 51, 1);
[view addSubview:textLabel];
return view;
}
}
/**
* pickerView选中代理
*
* @param pickerView pickerView description
* @param row 选中的row
* @param component 列
*/
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
switch (component) {
case 0:{ // 选择省份
self.selectedProvinceID = ((ProvinceModel *)[self.chinaModel getAllProvinceData][row]).ID;
[pickerView reloadComponent:1]; // 重载城市
[pickerView selectRow:0 inComponent:1 animated:YES];
self.chinaModel.provinceModel = (ProvinceModel *)[self.chinaModel getAllProvinceData][row];
// 选择了省份就自动定位到该省的第一个市
self.selectedCityID = ((CityModel *)[self.chinaModel getCityDataByParentID:self.selectedProvinceID][0]).ID;
self.chinaModel.cityModel = (CityModel *)[self.chinaModel getCityDataByParentID:self.selectedProvinceID][0];
// 选择了省份就自动定位到该省的第一个市的第一个区
[pickerView reloadComponent:2]; // 重载区域
[pickerView selectRow:0 inComponent:2 animated:YES];
// 海南 有的市没有区 真是坑啊
if ([self.chinaModel getAreaDataByParentID:self.selectedCityID].count > 0) {
self.chinaModel.areaModel = (AreaModel *)[self.chinaModel getAreaDataByParentID:self.selectedCityID][0];
}
else{
self.chinaModel.areaModel.NAME = @"";
self.chinaModel.areaModel.ID = @"";
self.chinaModel.areaModel.PARENT_AREA_ID = @"9";
self.chinaModel.areaModel.GRADE = @"3";
}
break;
}
case 1:{ // 选择城市
self.selectedCityID = ((CityModel *)[self.chinaModel getCityDataByParentID:self.selectedProvinceID][row]).ID;
[pickerView reloadComponent:2]; // 重载区域
[pickerView selectRow:0 inComponent:2 animated:YES];
self.chinaModel.cityModel = (CityModel *)[self.chinaModel getCityDataByParentID:self.selectedProvinceID][row];
// 选择了市就定位到该市的第一个区
// 海南 有的市没有区
if ([self.chinaModel getAreaDataByParentID:self.selectedCityID].count > 0) {
self.chinaModel.areaModel = (AreaModel *)[self.chinaModel getAreaDataByParentID:self.selectedCityID][0];
}
else{
self.chinaModel.areaModel.NAME = @"";
self.chinaModel.areaModel.ID = @"";
self.chinaModel.areaModel.PARENT_AREA_ID = @"9";
self.chinaModel.areaModel.GRADE = @"3";
}
break;
}
case 2: // 选择区域
// 海南 有的市没有区
if ([self.chinaModel getAreaDataByParentID:self.selectedCityID].count > 0) {
self.chinaModel.areaModel = (AreaModel *)[self.chinaModel getAreaDataByParentID:self.selectedCityID][row];
}
else{
self.chinaModel.areaModel.NAME = @"";
self.chinaModel.areaModel.ID = @"";
self.chinaModel.areaModel.PARENT_AREA_ID = @"9";
self.chinaModel.areaModel.GRADE = @"3";
}
break;
default:
break;
}
if ([_delegate respondsToSelector:@selector(chinaPlckerViewDelegateChinaModel:)]) {
[_delegate chinaPlckerViewDelegateChinaModel:self.chinaModel];
}
}
#pragma mark - 显示
-(void)showChinaPickerView
{
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
self.hidden = NO;
[UIView animateWithDuration:0.25f animations:^{
float pikceY = kScreenHeight - IT_KEYBOARD_HEIGHT;
self.addPickVview.frame = CGRectMake(0, pikceY, kScreenWidth, IT_KEYBOARD_HEIGHT);
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.25f animations:^{
self.hideView.backgroundColor = COLOR(45, 47, 56, 0.2f);
} completion:^(BOOL finished) {
}];
}];
}
#pragma mark - 隐藏
-(void)hideChinaPickerView
{
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
[UIView animateWithDuration:0.25f animations:^{
float pikceY = kScreenHeight;
self.addPickVview.frame = CGRectMake(0, pikceY, kScreenWidth, IT_KEYBOARD_HEIGHT);
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.25f animations:^{
self.hideView.backgroundColor = COLOR(45, 47, 56, 0.0f);
} completion:^(BOOL finished) {
self.hidden = YES;
}];
}];
if ([_delegate respondsToSelector:@selector(chinaPickerViewDelegateHidden)]) {
[_delegate chinaPickerViewDelegateHidden];
}
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end