PickerView的封装

来源:互联网 发布:cnc编程招聘信息 编辑:程序博客网 时间:2024/06/05 07:47

PickerView的封装

平时我在使用PickerView的时候,比较麻烦,要配置各种设置,本文就是主要介绍了如何封装了一个比较齐全的PickerView,其中可以直接用DatePickerView的四个基本类型以及一个自定义类型:
PickerViewTypeDate_Time,
PickerViewTypeDate_Date,
PickerViewTypeDate_DateAndTime,
PickerViewTypeDate_Timer,
PickerViewTypeData,
使用的时候,也是很方便的!

开源代码 - Github

使用的时候的代码

 PickerView * picker = [PickerView showPickerViewInView:view withType:button.tag];//    PickerView * picker = [PickerView showPickerViewInkeyWindowTopWithType:button.tag];//    PickerView * picker = [PickerView showPickerViewInVCTop:self withType:button.tag];    picker.dataSources = @[@[@"aaa",@"aab"],@[@"baa",@"bab"],@[@"caa",@"cab",@"cac"]];    // 获取选中的信息    [picker setSelectBlock:^(NSObject *data, BOOL isSureBtn) {        NSLog(@"%@ -- %d",data,isSureBtn);    }];
PickerView.h////  PickerView.h//  TouGuApp////  Created by tianshikechuang on 16/7/18.//  Copyright © 2016年 tianshikechuang. All rights reserved.//#import <UIKit/UIKit.h>typedef enum PickerViewType : NSUInteger {    PickerViewTypeDate_Time,    PickerViewTypeDate_Date,    PickerViewTypeDate_DateAndTime,    PickerViewTypeDate_Timer,    PickerViewTypeData,} PickerViewType;typedef void(^DidSelectBlock)(NSObject * data,BOOL isSureBtn);@interface PickerView : UIView/** *  传入的值必须是嵌套的数组 @[@[@"aaa",@"aab"],@[@"baa",@"bab"],@[@"caa",@"cab",@"cac"]] */@property(nonatomic, strong) NSArray * dataSources;@property(nonatomic, strong) DidSelectBlock selectBlock;@property(nonatomic, assign) PickerViewType pickerType;@property(nonatomic, assign) CGFloat contentHeight;////////////////////////////////////////////////////////////////////////////////////////////      PickerViewTypeDate -- 对应的属性 与 方法//////////////////////////////////////////////////////////////////////////////////////////@property (nonatomic, strong) NSDate *minimumDate;@property (nonatomic, strong) NSDate *maximumDate;@property (nonatomic) NSTimeInterval countDownDuration;@property (nonatomic) NSInteger      minuteInterval;- (void)setDate:(NSDate *)date animated:(BOOL)animated;/////////////////////////////////////////////////////////////////////////////////////+ (PickerView *)showPickerViewInkeyWindowTopWithType:(PickerViewType)type;+ (PickerView *)showPickerViewInVCTop:(UIViewController *)VC withType:(PickerViewType)type;+ (PickerView *)showPickerViewInView:(UIView *)view withType:(PickerViewType)type;- (void)setSelectBlock:(DidSelectBlock)selectBlock;@end
PickerView.m////  PickerView.m//  TouGuApp////  Created by tianshikechuang on 16/7/18.//  Copyright © 2016年 tianshikechuang. All rights reserved.//#import "PickerView.h"#define screenWidth [UIScreen mainScreen].bounds.size.width#define screenHeight [UIScreen mainScreen].bounds.size.height@interface PickerView () <UIPickerViewDelegate,UIPickerViewDataSource>{}@property(nonatomic, strong) UIPickerView * pickerView;@property(nonatomic, strong) UIDatePicker * datePicker;@property(nonatomic, strong) NSMutableArray * selectArr;@end@implementation PickerView+ (PickerView *)showPickerViewInkeyWindowTopWithType:(PickerViewType)type{    UIView * view = [UIApplication sharedApplication].keyWindow;    return [self showPickerViewInView:view withType:type];}+ (PickerView *)showPickerViewInVCTop:(UIViewController *)VC withType:(PickerViewType)type{    UIView * view;    if (VC.tabBarController) {        view = VC.tabBarController.view;    }else if (VC.navigationController){        view = VC.navigationController.view;    }else{        view = VC.view;    }    return [self showPickerViewInView:view withType:type];}+ (PickerView *)showPickerViewInView:(UIView *)view withType:(PickerViewType)type{    PickerView * picker = [[PickerView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)];    picker.pickerType = type;    [picker showInView:view];    [picker addSureAndCancelButton];    return picker;}- (instancetype)initWithFrame:(CGRect)frame{    if (self = [super initWithFrame:frame]) {        self.frame = CGRectMake(0, 0, screenWidth, screenHeight);        self.selectArr = [NSMutableArray array];        self.contentHeight = 230;        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeFromSuperview)];        tap.numberOfTapsRequired = 2;        [self addGestureRecognizer:tap];    }    return self;}- (UIPickerView *)pickerView{    if (_datePicker) {        [_datePicker removeFromSuperview];    }    if (!_pickerView) {        _pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, screenHeight - self.contentHeight, screenWidth, self.contentHeight)];        _pickerView.backgroundColor = [UIColor redColor];        _pickerView.delegate = self;        _pickerView.dataSource = self;    }    return _pickerView;}- (UIDatePicker *)datePicker{    if (_pickerView) {        [_pickerView removeFromSuperview];    }    if (!_datePicker) {        _datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, screenHeight - self.contentHeight, screenWidth, self.contentHeight)];        _datePicker.backgroundColor = [UIColor greenColor];        _datePicker.date = [NSDate date];        [_datePicker addTarget:self action:@selector(datePickerAction:) forControlEvents:UIControlEventValueChanged];    }    return _datePicker;}// 设置PickerView 的类型- (void)setPickerType:(PickerViewType)pickerType{    _pickerType = pickerType;    switch (pickerType) {        case PickerViewTypeDate_Time:            self.datePicker.datePickerMode = UIDatePickerModeTime;            [self addSubview:self.datePicker];            break;        case PickerViewTypeDate_Date:            self.datePicker.datePickerMode = UIDatePickerModeDate;            [self addSubview:self.datePicker];            break;        case PickerViewTypeDate_DateAndTime:            self.datePicker.datePickerMode = UIDatePickerModeDateAndTime;            [self addSubview:self.datePicker];            break;        case PickerViewTypeDate_Timer:            self.datePicker.datePickerMode = UIDatePickerModeCountDownTimer;            [self addSubview:self.datePicker];            break;        case PickerViewTypeData:            [self addSubview:self.pickerView];            break;        default:            break;    }}- (void)setDataSources:(NSArray *)dataSources{    _dataSources = dataSources;    for (NSArray * arr in dataSources) {        if (![arr isKindOfClass:[NSArray class]]) {            _dataSources = @[];            NSLog(@"\n\n--------- 传入的dataSources格式有误,请传入嵌套数组! (@[@[@\"1 - 1\",@\"1 - 2\"],@[@\"2 - 1\",@\"2 - 2\"]]) --------\n\n");            return;        }        [self.selectArr addObject:[arr firstObject]];    }}- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{    if (self.dataSources) {        return self.dataSources.count;    }else{        return 0;    }}- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{    if (self.dataSources[component]) {        NSArray * arr = self.dataSources[component];        return arr.count;    }else{        return 0;    }}- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{    NSArray * arr = self.dataSources[component];    return [arr objectAtIndex:row];}- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{    NSArray * arr = self.dataSources[component];    [self.selectArr replaceObjectAtIndex:component withObject:[arr objectAtIndex:row]];    if (self.selectBlock) {        self.selectBlock(self.selectArr,NO);    }}- (void)addSureAndCancelButton{    UIView * buttonView = [[UIView alloc] initWithFrame:CGRectMake(0, screenHeight - self.contentHeight - 40, screenWidth, 40)];    buttonView.backgroundColor = [UIColor grayColor];    [self addSubview:buttonView];    UIButton * cancel = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];    [cancel setTitle:@"取消" forState:UIControlStateNormal];    [cancel addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];    [buttonView addSubview:cancel];    UIButton * sure = [[UIButton alloc] initWithFrame:CGRectMake(screenWidth - 100, 0, 100, 40)];    [sure setTitle:@"确定" forState:UIControlStateNormal];    [sure addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];    [buttonView addSubview:sure];    sure.tag = 101;}- (void)buttonAction:(UIButton  *)button{    [self removeFromSuperview];    if (self.selectBlock && button.tag == 101) {        if (self.pickerType == PickerViewTypeData) {            self.selectBlock(self.selectArr,YES);        }else{            self.selectBlock(self.datePicker.date,YES);        }    }}- (void)datePickerAction:(UIDatePicker *)picker{    if (self.selectBlock) {        self.selectBlock(picker.date,NO);    }}- (void)showInView:(UIView *)view{    [view addSubview:self];    self.frame = CGRectMake(0, screenHeight, screenWidth, 0);    [UIView animateWithDuration:0.8 animations:^{        self.frame = CGRectMake(0, 0, screenWidth, screenHeight);    }];}- (void)removeFromSuperview{    [UIView animateWithDuration:0.8 animations:^{        self.frame = CGRectMake(0, screenHeight, screenWidth, screenHeight);    } completion:^(BOOL finished) {        [super removeFromSuperview];    }];}////////////////////////////////////////////////////////////////////////////////////////////      PickerViewTypeDate -- 对应的属性 与 方法//////////////////////////////////////////////////////////////////////////////////////////- (void)setMinimumDate:(NSDate *)minimumDate{    [self.datePicker setMinimumDate:minimumDate];}- (NSDate *)minimumDate{    return self.datePicker.minimumDate;}- (void)setMaximumDate:(NSDate *)maximumDate{    [self.datePicker setMaximumDate:maximumDate];}- (NSDate *)maximumDate{    return self.datePicker.maximumDate;}- (void)setCountDownDuration:(NSTimeInterval)countDownDuration{    [self.datePicker setCountDownDuration:countDownDuration];}- (NSTimeInterval)countDownDuration{    return self.datePicker.countDownDuration;}- (void)setMinuteInterval:(NSInteger)minuteInterval{    [self.datePicker setMinuteInterval:minuteInterval];}- (NSInteger)minuteInterval{    return self.datePicker.minuteInterval;}- (void)setDate:(NSDate *)date animated:(BOOL)animated{    [self.datePicker setDate:date animated:animated];}//////////////////////////////////////////////////////////////////////////////////////////@end
0 0