iOS pickerView(所有类型一网打尽)
概述
详细
首先看下项目的整体结构:

一、准备工作
UIPickerView,即取值控件。而取值控件就行iOS的下拉菜单,虽然在界面呈现方面它和所谓的下拉菜单并不同,不过对于使用的目的和场景确实相同的。UIPickerView直接继承自UIView,没有继承UIControl,因此,它并不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其代理对象来完成。UIPickView和UITableView的使用过程较相似,都需要一个数据源对象和一个代理对象。
二、程序实现
(1) - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView; 返回PickerView的列数
(2) - (NSInteger)pickerView:(UIPickerView
*)pickerView numberOfRowsInComponent:(NSInteger)component;
返回PickView的component列对应的行数
(3) - (nullableNSString *)pickerView:(UIPickerView
*)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
返回每一列每一行的内容
(4) - (void)pickerView:(UIPickerView
*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
用户选中PickView的某一列和某一行时会调用该方法
(5) - (nullableNSAttributedString *)pickerView:(UIPickerView
*)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
修改PickView中component列row行的文本的样式
(6) - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view 该方法返回的UIView的控件将直接作为UIPickView对应的component 列row行的列表项
(7) - (CGFloat)pickerView:(UIPickerView
*)pickerView rowHeightForComponent:(NSInteger)component 设置component列对应的行高
(8) - (CGFloat)pickerView:(UIPickerView
*)pickerView widthForComponent:(NSInteger)component
该方法设置component列对应的宽度
(9) - (void)selectRow:(NSInteger)row
inComponent:(NSInteger)component animated:(BOOL)animated
该方法设置选中的UIPickView 第component列row行项,最后一个参数animated代表是否要用到动画
(10) @property(nonatomic,readonly)NSInteger numberOfComponents;
获取UIPickerView指定列中包含的列表项的数量,该属性是只读的。
在项目中,我们是将toolBar与View分开设置的,我们可以随意设置,
对于单数组 多数组 地区的pickView 的话我们都是只需要设置view 添加数据等等,而对于日期,我对他进行了简单的处理日式的时间是从当前时间开始,减少用户的选择滑动
+ (NSDateComponents *)currentDateComponents
{
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday;
return [calendar components:unitFlags fromDate:[NSDate date]];
} + (NSInteger)currentMonth
{
return [NSCalendar currentDateComponents].month;
} + (NSInteger)currentYear
{
return [NSCalendar currentDateComponents].year;
} + (NSInteger)currentDay
{
return [NSCalendar currentDateComponents].day;
} + (NSInteger)currnentWeekday
{
return [NSCalendar currentDateComponents].weekday;
} + (NSInteger)getDaysWithYear:(NSInteger)year
month:(NSInteger)month
{
switch (month) {
case 1:
return 31;
break;
case 2:
if (year%400==0 || (year%100!=0 && year%4 == 0)) {
return 29;
}else{
return 28;
}
break;
case 3:
return 31;
break;
case 4:
return 30;
break;
case 5:
return 31;
break;
case 6:
return 30;
break;
case 7:
return 31;
break;
case 8:
return 31;
break;
case 9:
return 30;
break;
case 10:
return 31;
break;
case 11:
return 30;
break;
case 12:
return 31;
break;
default:
return 0;
break;
}
} + (NSInteger)getFirstWeekdayWithYear:(NSInteger)year
month:(NSInteger)month
{
NSString *stringDate = [NSString stringWithFormat:@"%ld-%ld-01", (long)year, (long)month];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yy-MM-dd"];
NSDate *date = [formatter dateFromString:stringDate]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [gregorian components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitWeekday) fromDate:date];
return [components weekday];
} + (NSComparisonResult)compareWithComponentsOne:(NSDateComponents *)componentsOne
componentsTwo:(NSDateComponents *)componentsTwo
{
if (componentsOne.year == componentsTwo.year &&
componentsOne.month == componentsTwo.month &&
componentsOne.day == componentsTwo.day) {
return NSOrderedSame;
}else if (componentsOne.year < componentsTwo.year ||
(componentsOne.year == componentsTwo.year && componentsOne.month < componentsTwo.month) ||
(componentsOne.year == componentsTwo.year && componentsOne.month == componentsTwo.month && componentsOne.day < componentsTwo.day)) {
return NSOrderedAscending;
}else {
return NSOrderedDescending;
}
} + (NSMutableArray *)arrayComponentsWithComponentsOne:(NSDateComponents *)componentsOne
componentsTwo:(NSDateComponents *)componentsTwo
{
NSMutableArray *arrayComponents = [NSMutableArray array]; NSString *stringOne = [NSString stringWithFormat:@"%ld-%ld-%ld", componentsOne.year,
componentsOne.month,
componentsOne.day];
NSString *stringTwo = [NSString stringWithFormat:@"%ld-%ld-%ld", componentsTwo.year,
componentsTwo.month,
componentsTwo.day];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yy-MM-dd"]; NSDate *dateFromString = [dateFormatter dateFromString:stringOne];
NSDate *dateToString = [dateFormatter dateFromString:stringTwo];
int timediff = [dateToString timeIntervalSince1970]-[dateFromString timeIntervalSince1970]; NSTimeInterval timeInterval = [dateFromString timeIntervalSinceDate:dateFromString]; for (int i = 0; i <= timediff; i+=86400) {
timeInterval = i;
NSDate *date = [dateFromString dateByAddingTimeInterval:timeInterval]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday;
[arrayComponents addObject:[calendar components:unitFlags fromDate:date]];
}
return arrayComponents;
} + (NSDateComponents *)dateComponentsWithString:(NSString *)String
{
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yy-MM-dd"];
NSDate *date = [formatter dateFromString:String]; NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday;
return [calendar components:unitFlags fromDate:date];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
{ NSString *text;
if (component == 0) {
text = [NSString stringWithFormat:@"%ld",row + 1900];
}else if (component == 1){
text = [NSString stringWithFormat:@"%ld", row + 1];
}else{
text = [NSString stringWithFormat:@"%ld", row + 1];
}
所有的类型我都是对其用代理处理,我们只需要再需要使用的控制其中添加数据就好,
NSMutableArray *arrayData = [NSMutableArray array];
for (int i = 150; i < 220; i++) {
NSString *string = [NSString stringWithFormat:@"%d", i];
[arrayData addObject:string];
}
GZSinglePicker *sing = [[GZSinglePicker alloc]init];
[sing setArrayData:arrayData];
[sing setTitle:@"请选择身高"];
[sing setTitleUnit:@""];
[sing setDelegate:self];
[sing show];
我们可以对标题进行自定义,选择的东西会实时显示在顶部。
三、运行效果
1,单数组pick运行图

2,多数组pick:(可以在顶部添加数据类型)

3,地址选择pick:

4,日期pick选择:

时间是从我们选择的当天开始;
四、其他补充
1、最近在封装一些大家常用控件,希望大家支持;
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
iOS pickerView(所有类型一网打尽)的更多相关文章
- iOS中block类型大全
iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调 ...
- iOS数据存储类型 及 堆(heap)和栈(stack)
iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 -- 由编译器自动分配释放. 2堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...
- iOS 后台运行 类型
iOS后台运行,需要有特定的类型才可以进行.这些内容并不是一直不变的,苹果也在逐步的更新这些内容. 本文内容是2015年11月03日时苹果支持的后台运行类型. 这是官方连接地址 其中较为重要的是下面这 ...
- IOS UTI统一类型标识符:判断文件类型通过后缀
今天在学习文档和数据共享中,首先讲的处理统一类型标识符UTI.第一次见,所以记下来以备之用,首先了解UTI和MIME的概念 1.同一类型标识符(Uniform Type Identifier,UTI) ...
- iOS UTI(统一类型标识)
同一类型标识符(Uniform Type Identifier,UTI)代表IOS信息共享的中心组件.可以把它看成下一代的MIME类型.UTI是标识资源类型(比如图像和文本)的字符串,他们制定哪些类型 ...
- IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?
对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonat ...
- iOS平台网络类型检测
老大新增个需求,连接服务器时要区分内外网,需求理解了,现实很骨感啊,没办法,干. #import <Foundation/Foundation.h> /* 依赖于以下Framework S ...
- iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS
一般情况下,我们采用C风格的enum关键字可以定义枚举类型. enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFro ...
- iOS 一些struct类型的NSLog输出格式-b
我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...
随机推荐
- SQL的in的参数化查询
SqlCommand cmd=con.CreateCommand(); cmd.CommandText="exec('select * from novel where novelid in ...
- IPtables/NetFilter
前提知识 任何主机若要与非同网络中的主机通信,则必须将报文发送到默认网关: 对Linux而言,IP地址是属于主机(内核中)的,不属于网卡,只要属于当前主机的IP地址间,都可直接响应,不称为转发 私有地 ...
- CentOS的REMI源
CentOS下除了EPEL源之外还有REMI的源,REMI源保证了软件的最新版,注意:并不一定是稳定的.并且安装了REMI源默认是不开启的,只有有需要的时候才进行开启使用. 在CentOS 7上: # ...
- ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)
下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整 ...
- Digital variable resistor compensates voltage regulator
A variable resistor that integrates a programmable, temperature-indexed look-up table can compensate ...
- STM32 Hardware Development
http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 http://w ...
- OPENGL架构
第2章 OpenGL 简介 每台计算机都有专门处理图形的硬件,它们控制着屏幕上显示的内容.OpenGL向这种硬件发出命令,告诉它们执行什么操作.计算机游戏或者其他任意软件借助制造商提供的设备驱动程序, ...
- C/C++ 中头文件相互包含引发的问题
转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟 ...
- 通过完整示例来理解如何使用 epoll
网络服务器通常使用一个独立的进程或线程来实现每个连接.由于高性能应用程序需要同时处理大量的客户端,这种方法就不太好用了,因为资源占用和上下文切换时间等因素影响了同时处理大量客户端的能力.另一种方法是在 ...
- Javascript屏蔽鼠标右键-超简单,不过还是记录一下
Javascript屏蔽鼠标右键,其实作用也不大,也许是为了防止别人查看源代码,其实想查看源代码有多种途径,未必需要通过鼠标右键.不过当我们自定义鼠标右键弹出菜单时,也许需要这些. 下面是源码: 1 ...