美文网首页
[iOS]自定义弹出PresentPickerView

[iOS]自定义弹出PresentPickerView

作者: 溜萝卜 | 来源:发表于2016-10-26 14:45 被阅读451次

    项目中,我们往往需要用到选择器选择身高、性别等。这篇文章教大家做一个炫酷的pickerViewController~
    使用方法:

    #import "PickerViewController.h"
    
       [UIApplication sharedApplication].statusBarStyle =  UIStatusBarStyleLightContent;
        
        //选中传值
        PickerViewController *picker = [[PickerViewController alloc]init];
        
        picker.myblock = ^(id data1){
            NSLog(@"%@",data1);
        };
        
       //自定义数组
        NSMutableArray *arr = [NSMutableArray array];
        for (int i = 140; i<200; i++) {
            [arr addObject:[NSString stringWithFormat:@"%dcm",i]];
        }
        
        
        picker.dataArray = [NSArray arrayWithArray:arr];
        [picker createPickerWithTitile:@"身高" locText:@"165cm"];
        
        [self presentViewController:picker animated:YES completion:nil];
        
    

    实现

    pickerViewController.h
    
    @interface PickerViewController : UIViewController
    
    /** 外界传数组等*/
    @property (nonatomic, strong) NSArray *dataArray;
    /** 设置顶部颜色*/
    @property (nonatomic, strong) UIColor *titleColor;
    
    @property (nonatomic, strong)MyBlock myblock;
    
    /** 
     * title:标题 type:数组类型 locText:默认显示数据,如178cm
     */
    - (void)createPickerWithTitile:(NSString *)title
                           locText:(NSString *)locText;
    
    PickerViewController.m
    
    #import "PickerViewController.h"
    #import "PresentOneTransition.h"
    #import "UIView+Extension.h"
    
    #define KButtonH 30
    #define KButtonW 50
    @interface PickerViewController ()<UIViewControllerTransitioningDelegate,UIPickerViewDelegate,UIPickerViewDataSource>
    {
        //默认行
        NSUInteger placeHolderRow;
        
        //选中的
        NSString *chooseStr;
    }
    /** 选择器*/
    @property (nonatomic, strong) UIPickerView *pickerView;
    /** 取消按钮*/
    @property (nonatomic, strong) UIButton *leftButton;
    /** 确定*/
    @property (nonatomic, strong) UIButton *rightButton;
    /** 标题View*/
    @property (nonatomic, strong) UIView *titleView;
    /** 标题lable*/
    @property (nonatomic, strong) UILabel *titileLabel;
    
    @end
    
    @implementation PickerViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.layer.cornerRadius = 10;
        self.view.layer.masksToBounds = YES;
        self.view.backgroundColor = [UIColor whiteColor];
        
        
    }
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            self.transitioningDelegate = self;
            self.modalPresentationStyle = UIModalPresentationCustom;
        }
        return self;
    }
    - (UIButton *)rightButton {
        
        if (!_rightButton) {
            UIButton *rightButton = [self setBtnWithTitle:@"确定"];
            _rightButton = rightButton;
        }
        
        return _rightButton;
    }
    
    - (UIButton *)leftButton {
        
        if (!_leftButton) {
            UIButton *leftButton = [self setBtnWithTitle:@"取消"];
            
            _leftButton = leftButton;
        }
        return _leftButton;
    }
    
    - (UILabel *)titileLabel {
        
        if (!_titileLabel) {
            
            UILabel *titleLabel = [[UILabel alloc]init];
            titleLabel.textAlignment = NSTextAlignmentCenter;
            titleLabel.font = [UIFont systemFontOfSize:12];
            titleLabel.textColor = [UIColor blackColor];
            titleLabel.width = self.view.width - 2*KButtonW;
            titleLabel.height = KButtonH;
            titleLabel.x = KButtonW;
            
            _titileLabel = titleLabel;
        }
        
        return _titileLabel;
    }
    
    - (UIView *)titleView {
        
        if (!_titleView) {
            UIView *titleView = [[UIView alloc]init];
            titleView.x = 0;
            titleView.y = 0;
            titleView.width = self.view.width;
            titleView.height = KButtonH;
            titleView.backgroundColor = self.titleColor;
            
            [titleView addSubview:self.leftButton];
            [titleView addSubview:self.rightButton];
            [titleView addSubview:self.titileLabel];
            
            self.leftButton.x = 0;
            self.leftButton.y = 0;
            
            self.rightButton.x = titleView.width - KButtonW;
            self.rightButton.y = 0;
            
            _titleView = titleView;
        }
        
        return _titleView;
    }
    
    - (UIPickerView *)pickerView {
        
        if (!_pickerView) {
            
            UIPickerView *pickerView = [[UIPickerView alloc]init];
            [[UIPickerView appearance] setBackgroundColor:[UIColor whiteColor]];
            pickerView.x = 0;
            pickerView.width = self.view.width;
            pickerView.y = CGRectGetMaxY(self.titleView.frame);
    //        pickerView.height = self.view.height - KButtonH;
            pickerView.dataSource = self;
            pickerView.delegate = self;
            [pickerView reloadAllComponents];
            
            _pickerView = pickerView;
        }
        
        return _pickerView;
    }
    - (UIButton *)setBtnWithTitle:(NSString *)title {
        
        UIButton *btn = [[UIButton alloc]init];
        btn.height = KButtonH;
        btn.width = KButtonW;
        [btn setTitle:title forState:UIControlStateNormal];
        btn.titleLabel.font = [UIFont systemFontOfSize:12];
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [btn addTarget:self action:@selector(dismiss:) forControlEvents:UIControlEventTouchUpInside];
    
        return btn;
    }
    /** 可以自己定义二维数组、三维数组。根据type传数据,pickerView 的Component根据数组维度来变*/
    - (void)createPickerWithTitile:(NSString *)title
                           locText:(NSString *)locText
    {
        //subViews
        [self.view addSubview:self.titleView];
        [self.view addSubview:self.pickerView];
        
        //赋值
        self.titileLabel.text = title;
        
        //获得默认显示列
        NSUInteger row = [self returnRowwithArr:self.dataArray withStr:locText];
        
        //默认
        chooseStr = title;
        
        //选中
        [self.pickerView selectRow:row inComponent:0 animated:YES];
        
    
        
        
    }
    
    //确定,传值
    - (void)dismiss:(UIButton *)button
    {
        [self presentedControllerPressedDissmiss];
        
        if ([button isEqual:self.leftButton]) {
            
        }else if ([button isEqual:self.rightButton]){
            if (_myblock) {
                _myblock(chooseStr);
            }
        }
       
    }
    
    - (void)presentedControllerPressedDissmiss
    {
        [self dismissViewControllerAnimated:YES completion:^{
            [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
        }];
    }
    
    //记住相应字符串在数组中得位置
    - (NSUInteger)returnRowwithArr:(NSArray *)arr withStr:(NSString *)str
    {
        NSUInteger index = 0;
        for (int i = 0; i<arr.count; i++) {
            if ([str isEqual:arr[i]]) {
                
                index = i;
            }
        }
        return index;
    }
    
    - (UIColor *)titleColor {
        
        if (!_titleColor) {
            _titleColor = Color(250, 230, 0);
        }
        
        return _titleColor;
    }
    
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
        
        return self.dataArray.count;
        
    }
    
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    {
        
        return 1;
    }
    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
        
        return self.dataArray[row];
    }
    
    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
        
        chooseStr = self.dataArray[row];
    }
    
    - (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source{
        
        return [PresentOneTransition transitionWithTransitionType:PresentOneTransitionTypePresent];
    }
    
    - (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed{
        
        return [PresentOneTransition transitionWithTransitionType:PresentOneTransitionTypeDismiss];
    }
    
    @end
    
    test.gif

    ** 可以自行扩充数组维度,比如说两列picker,但是pickerView的dataSource和代理要做相应的改变**
    代码地址:我删了...之后再重新上传

    相关文章

      网友评论

          本文标题:[iOS]自定义弹出PresentPickerView

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