iOS 自定义PickerView

前言

自定义一个pickerView,解决如下问题:
1、添加“确定”和“取消”按钮;
2、增加向上弹出和向下消失动画;
3、选中某行后,触发一个事件;

一、自定义PickerView的代码

1、h文件中代码如下:

#import <UIKit/UIKit.h>

typedef void (^MyBasicBlock)(id result);

@interface YCPickerView : UIView

@property (retain, nonatomic) NSArray *arrPickerData;
@property (retain, nonatomic) UIPickerView *pickerView;

@property (nonatomic, copy) MyBasicBlock selectBlock;

- (void)popPickerView;

@end

2、m文件中代码如下:

#define SCREEN_WIDTH                [[UIScreen mainScreen] bounds].size.width
#define SCREEN_HEIGHT               [[UIScreen mainScreen] bounds].size.height
#define PICKERVIEW_HEIGHT           256


#import "YCPickerView.h"

@interface YCPickerView () <UIPickerViewDelegate,UIPickerViewDataSource>
{
    NSInteger selectRow;
}

@property (retain, nonatomic) UIView *baseView;

@end

@implementation YCPickerView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        _baseView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-PICKERVIEW_HEIGHT, SCREEN_WIDTH, PICKERVIEW_HEIGHT)];
        _baseView.backgroundColor = [UIColor orangeColor];
        [self addSubview:_baseView];

        UIButton *btnOK = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-50, 0, 40, 40)];
        [btnOK setTitle:@"确定" forState:UIControlStateNormal];
        [btnOK setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btnOK addTarget:self action:@selector(pickerViewBtnOK:) forControlEvents:UIControlEventTouchUpInside];
        [_baseView addSubview:btnOK];

        UIButton *btnCancel = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 40, 40)];
        [btnCancel setTitle:@"取消" forState:UIControlStateNormal];
        [btnCancel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btnCancel addTarget:self action:@selector(pickerViewBtnCancel:) forControlEvents:UIControlEventTouchUpInside];
        [_baseView addSubview:btnCancel];

        _pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 40, SCREEN_WIDTH, PICKERVIEW_HEIGHT-40)];
        _pickerView.delegate = self;
        _pickerView.dataSource = self;
        _pickerView.backgroundColor = [UIColor whiteColor];
        [_baseView addSubview:_pickerView];


        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissPickerView)];
        [self addGestureRecognizer:tapGesture];

    }
    return self;
}

#pragma mark - UIPickerViewDataSource

//返回多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

//每列对应多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return _arrPickerData.count;
}

//每行显示的数据
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return _arrPickerData[row];
}


#pragma mark - UIPickerViewDelegate

//选中pickerView的某一行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    selectRow = row;
}

#pragma mark - Private Menthods

//弹出pickerView
- (void)popPickerView
{
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
                     }];

}

//取消pickerView
- (void)dismissPickerView
{
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT);
                     }];
}

//确定
- (void)pickerViewBtnOK:(id)sender
{
    if (self.selectBlock) {
        self.selectBlock(_arrPickerData[selectRow]);
    }
    [self dismissPickerView];
}

//取消
- (void)pickerViewBtnCancel:(id)sender
{
    if (self.selectBlock) {
        self.selectBlock(nil);
    }

    [self dismissPickerView];

}
@end

二、调用

#import "ViewController.h"
#import "YCPickerView.h"

@interface ViewController ()
{
    YCPickerView *ycPickerView;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    NSArray *arrData = @[@"星期一",@"星期二",@"星期三",@"星期四",@"星期五",@"星期六",@"星期天"];

    ycPickerView = [[YCPickerView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, self.view.frame.size.height)];
    ycPickerView.arrPickerData = arrData;
    [ycPickerView.pickerView selectRow:3 inComponent:0 animated:YES]; //pickerview默认选中行
    [self.view addSubview:ycPickerView];

    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(10, 100, self.view.frame.size.width-20, 35)];
    [btn setBackgroundColor:[UIColor orangeColor]];
    [btn setTintColor:[UIColor whiteColor]];
    [btn setTitle:@"测试PickerView" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnTest:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

    __block ViewController *blockSelf = self;
    ycPickerView.selectBlock = ^(NSString *str){
        if (str.length > 0) {
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"标题" message:str preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
            UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil];
            [alert addAction:cancelAction];
            [alert addAction:okAction];
            [blockSelf presentViewController:alert animated:YES completion:nil];
         }
    };
}

- (void)btnTest:(id)sender
{
    [ycPickerView popPickerView];
}
@end

三、效果图及Demo下载

这里写图片描述

Demo下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: h5pickerview是一个基于H5技术的选择器组件。它可以在移动端的网页中使用,实现选择日期、时间、省市区等功能。 h5pickerview的特点有以下几个方面: 1. 轻量级:h5pickerview是一个轻量级的插件,它的体积小,加载速度快,不会占用太多的资源。 2. 灵活可定制:h5pickerview提供了丰富的配置项,可以根据需求自定义选择器的样式和行为。可以选择日期范围、设定初始值等。 3. 跨平台兼容:由于基于H5技术开发,h5pickerview可以兼容多个平台,无论是iOS、Android还是其他系统,都能够正常运行。 4. 使用简单:h5pickerview的使用非常简单,只需要在页面中引入相关的样式文件和脚本文件,然后在需要的地方添加相应的HTML标签即可。 5. 功能丰富:h5pickerview支持选择日期、时间、省市区等功能,用户可以方便地进行选择操作,满足不同场景下的需求。 总结来说,h5pickerview是一个方便实用的选择器组件,它能够帮助开发者快速实现选择日期、时间等功能,在移动端网页中提供更好的用户体验。无论是在线预约、订单提交还是其他需要选择操作的场景,h5pickerview都能够发挥重要作用。 ### 回答2: h5pickerview 是一种基于H5开发的日期和时间选择器。这个选择器可以在移动设备的浏览器中使用,通过H5代码进行调用和使用。 h5pickerview 可以通过HTML5的input标签的type属性来实现,比如可以使用type="date"实现日期的选择,使用type="time"实现时间的选择。此外,还可以通过JavaScript进行更加定制化的使用。 h5pickerview 具有简单易用的特点,开发者可以根据自己的需求来配置和使用。通过简单的HTML代码和JavaScript代码,可以轻松地调用和集成到页面中。 h5pickerview 支持多种配置选项,比如可以设置日期的起始和结束范围,可以设置日期和时间的格式等等。这样,可以根据具体的需求来自定义选择器的外观和行为。 总的来说,h5pickerview 是一种方便快捷的日期和时间选择器,通过H5开发可以在移动设备的浏览器中使用。它具有简单易用、灵活可配置等优点,能够满足开发者的各种需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值