iOS 自定义UIPickerView地区选择器视图 —— HERO博客

自定义UIPickerView地区选择器视图 ,首先看一下效果图:

下面贴上相关代码:

ViewController:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end


#import "ViewController.h"
#import "HWAreaPicker.h"

#define mainW [UIScreen mainScreen].bounds.size.width
#define mainH [UIScreen mainScreen].bounds.size.height

@interface ViewController ()<UITextFieldDelegate, HWAreaPickerDelegate>

@property (nonatomic, strong) HWAreaPicker *areaPicker;
@property (nonatomic, strong) UITextField *areaTextField;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor blackColor];
    
    //创建控件
    [self creatControl];
}

- (void)creatControl
{
    //textField
    _areaTextField = [[UITextField alloc] initWithFrame:CGRectMake(mainW * 0.05, mainW * 0.72, mainW * 0.9, mainW * 0.12)];
    _areaTextField.background = [UIImage imageNamed:@"textFieldBj"];
    _areaTextField.textAlignment = NSTextAlignmentRight;
    _areaTextField.placeholder = @"请设置地区";
    _areaTextField.delegate = self;
    UILabel *lab2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, mainW * 0.4, mainW * 0.12)];
    lab2.textAlignment = NSTextAlignmentLeft;
    lab2.text = @"  地区";
    lab2.textColor = [UIColor grayColor];
    _areaTextField.leftView = lab2;
    _areaTextField.leftViewMode = UITextFieldViewModeAlways;
    UILabel *lab22 = [[UILabel alloc] initWithFrame:CGRectMake(mainW * 0.12 - 15, 0, 15, mainW * 0.12)];
    _areaTextField.rightView = lab22;
    _areaTextField.rightViewMode = UITextFieldViewModeAlways;
    [self.view addSubview:_areaTextField];
    
    //地区选择器
    HWAreaPicker *areaPicker = [[HWAreaPicker alloc] initWithFrame:CGRectMake(mainW * 0.05, mainH, mainW * 0.9, mainW * 0.5)];
    areaPicker.delegate = self;
    [self.view addSubview:areaPicker];
    self.areaPicker = areaPicker;
}

#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if (_areaPicker.frame.origin.y != mainH && _areaPicker != nil) {
        [_areaPicker dismiss];
        return NO;
        
    }else if (textField == _areaTextField) {
        [_areaPicker show];
        return NO;
    }
    
    return YES;
}

#pragma mark - HWAreaPickerDelegate
- (void)didSelectRowInHWAreaPickerView:(HWAreaPicker *)areaPicker
{
    _areaTextField.text = [NSString stringWithFormat:@"%@ %@ %@", areaPicker.locate.state, areaPicker.locate.city, areaPicker.locate.district];
}

@end

HWAreaPicker:

#import <UIKit/UIKit.h>

@class HWAreaPicker, HWLocationModel;

@protocol HWAreaPickerDelegate <NSObject>

/**
 *  HWAreaPicker选中代理事件
 *
 *  @param areaPicker HWAreaPicker
 */
- (void)didSelectRowInHWAreaPickerView:(HWAreaPicker *)areaPicker;

@end

@interface HWAreaPicker : UIView

@property (nonatomic, strong) HWLocationModel *locate;
@property (nonatomic, weak) id<HWAreaPickerDelegate> delegate;

- (void)show;
- (void)dismiss;

@end


#import "HWAreaPicker.h"

//获得屏幕的宽高
#define mainW [UIScreen mainScreen].bounds.size.width
#define mainH [UIScreen mainScreen].bounds.size.height

@interface HWAreaPicker ()<UIPickerViewDelegate, UIPickerViewDataSource>

@property (nonatomic, strong) UIPickerView *areaPicker;
@property (nonatomic, strong) NSArray *provinces;
@property (nonatomic, strong) NSArray *cities;
@property (nonatomic, strong) NSArray *areas;

@end

@implementation HWAreaPicker

- (HWLocationModel *)locate
{
    if (_locate == nil) {
        _locate = [[HWLocationModel alloc] init];
    }
    return _locate;
}

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        //背景框
        UIImageView *back = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, mainW * 0.9, mainW * 0.5)];
        back.image = [UIImage imageNamed:@"areaPickerBj"];
        [self addSubview:back];
        
        //地区选择器
        _areaPicker = [[UIPickerView alloc] init];
        _areaPicker.frame = CGRectMake(10, 10, self.frame.size.width - 20, 120);
        _areaPicker.delegate = self;
        _areaPicker.dataSource = self;
        [self addSubview:_areaPicker];
  
        _provinces = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area.plist" ofType:nil]];
        _cities = [[_provinces objectAtIndex:0] objectForKey:@"cities"];
        
        self.locate.state = [[_provinces objectAtIndex:0] objectForKey:@"state"];
        self.locate.city = [[_cities objectAtIndex:0] objectForKey:@"city"];
        
        _areas = [[_cities objectAtIndex:0] objectForKey:@"areas"];
        if (_areas.count > 0) {
            self.locate.district = [_areas objectAtIndex:0];
        } else{
            self.locate.district = @"";
        }
        
        //确定按钮
        UIButton *sureBtn = [[UIButton alloc] initWithFrame:CGRectMake((self.frame.size.width - mainW * 0.36) * 0.5, self.frame.size.height * 0.747, mainW * 0.36, mainW * 0.11)];
        [sureBtn setImage:[UIImage imageNamed:@"sureBtn"] forState:UIControlStateNormal];
        [sureBtn addTarget:self action:@selector(sureBtnOnClick) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:sureBtn];
    }
    return self;
}

#pragma mark - UIPickerViewDelegate
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 3;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    switch (component) {
        case 0:
            return [_provinces count];
            break;
        case 1:
            return [_cities count];
            break;
        case 2:
            return [_areas count];
            break;
        default:
            return 0;
            break;
    }
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    switch (component) {
        case 0:
            return [[_provinces objectAtIndex:row] objectForKey:@"state"];
            break;
        case 1:
            return [[_cities objectAtIndex:row] objectForKey:@"city"];
            break;
        case 2:
            if ([_areas count] > 0) {
                return [_areas objectAtIndex:row];
                break;
            }
        default:
            return  @"";
            break;
    }
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    switch (component) {
        case 0:
            _cities = [[_provinces objectAtIndex:row] objectForKey:@"cities"];
            [_areaPicker selectRow:0 inComponent:1 animated:YES];
            [_areaPicker reloadComponent:1];
            
            _areas = [[_cities objectAtIndex:0] objectForKey:@"areas"];
            [_areaPicker selectRow:0 inComponent:2 animated:YES];
            [_areaPicker reloadComponent:2];
            
            self.locate.state = [[_provinces objectAtIndex:row] objectForKey:@"state"];
            self.locate.city = [[_cities objectAtIndex:0] objectForKey:@"city"];
            if ([_areas count] > 0) {
                self.locate.district = [_areas objectAtIndex:0];
            } else{
                self.locate.district = @"";
            }
            break;
        case 1:
            _areas = [[_cities objectAtIndex:row] objectForKey:@"areas"];
            [_areaPicker selectRow:0 inComponent:2 animated:YES];
            [_areaPicker reloadComponent:2];
            
            self.locate.city = [[_cities objectAtIndex:row] objectForKey:@"city"];
            if ([_areas count] > 0) {
                self.locate.district = [_areas objectAtIndex:0];
            } else{
                self.locate.district = @"";
            }
            break;
        case 2:
            if ([_areas count] > 0) {
                self.locate.district = [_areas objectAtIndex:row];
            } else{
                self.locate.district = @"";
            }
            break;
        default:
            break;
    }
    
    if (_delegate && [_delegate respondsToSelector:@selector(didSelectRowInHWAreaPickerView:)]) {
        [_delegate didSelectRowInHWAreaPickerView:self];
    }
}

- (void)sureBtnOnClick
{
    [self dismiss];
}

- (void)show
{
    [UIView animateWithDuration:0.3 animations:^{
        self.frame = CGRectMake(mainW * 0.05, mainH - mainW * 0.75, mainW * 0.9, mainW * 0.5);
    }];
}

- (void)dismiss
{
    [UIView animateWithDuration:0.3 animations:^{
        self.frame = CGRectMake(mainW * 0.05, mainH, mainW * 0.9, mainW * 0.5);
    }];
}

@end

HWLocationModel:

#import <Foundation/Foundation.h>

@interface HWLocationModel : NSObject

@property (copy, nonatomic) NSString *country;
@property (copy, nonatomic) NSString *state;
@property (copy, nonatomic) NSString *city;
@property (copy, nonatomic) NSString *district;
@property (copy, nonatomic) NSString *street;
@property (nonatomic) double latitude;
@property (nonatomic) double longitude;

@end


#import "HWLocationModel.h"

@implementation HWLocationModel

@synthesize country = _country;
@synthesize state = _state;
@synthesize city = _city;
@synthesize district = _district;
@synthesize street = _street;
@synthesize latitude = _latitude;
@synthesize longitude = _longitude;

@end





  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值