框架:https://github.com/Zws-China/DatePicker
简单封装:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@class LYBDatePickView;
@protocol LYBDatePickViewdelegate <NSObject>
-(void)LYBDatePickView:(LYBDatePickView*)LYBDatePickView datestr:(NSString *)datestr type:(NSInteger )type;
@end
@interface LYBDatePickView : UIView
@property(nonatomic,assign)NSInteger selecttype;
@property(nonatomic,copy)void (^selectDateBlock)(NSString *selectDateStr);
@property(nonatomic,weak)id<LYBDatePickViewdelegate> delegate;
@end
NS_ASSUME_NONNULL_END
#import "LYBDatePickView.h"
@interface LYBDatePickView()
@property(nonatomic,strong)UIDatePicker *datePicker;
@property(nonatomic,strong)UITextField *birthdayField;
@property(nonatomic,assign)NSInteger type;
@end
@implementation LYBDatePickView
-(instancetype)initWithFrame:(CGRect)frame{
if(self=[super initWithFrame:frame]){
[self setBirthDayKeyBoardWithframe:frame];
}
return self;
}
-(void)surebtnclick{
[self removeFromSuperview];
}
//选则出生日期
- (void)setBirthDayKeyBoardWithframe:(CGRect)frame{
self.backgroundColor=[UIColor whiteColor];
self.birthdayField=[[UITextField alloc]initWithFrame:CGRectMake(10,0,300 , 50)];
self.birthdayField.borderStyle=UITextBorderStyleRoundedRect;
// [self addSubview:self.birthdayField];
UIView *topbgview=[[UIView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, 50)];
topbgview.backgroundColor=NORMALBGCOLOR;
topbgview.backgroundColor=[UIColor whiteColor];
[self addSubview:topbgview];
UIButton *surebtn=[[UIButton alloc]initWithFrame:CGRectMake(WIDTH-80, 0, 80, 40)];
[surebtn setTitle:@"确定" forState:UIControlStateNormal];
[surebtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[surebtn addTarget:self action:@selector(surebtnclick) forControlEvents:UIControlEventTouchUpInside];
[topbgview addSubview:surebtn];
//设置上牌日期的inputview
self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0,50, WIDTH, frame.size.height-50)];
[self addSubview:self.datePicker];
self.datePicker.datePickerMode = UIDatePickerModeDate;
self.datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];//本地化属性,默认是zh_CN
//设置最小日期
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [[NSDateComponents alloc] init];
//最小日期
components.year = 1979;
components.month = 1;
components.day = 1;
NSDate *minDate = [calendar dateFromComponents:components];
// self.datePicker.date=minDate;//如果不设置,默认是当前时间
//最大日期
NSDate *maxDate = [[NSDate date] dateByAddingTimeInterval:60 * 60 * 24*1000];//在当前时间的基础上增加10天(60 * 60 * 24*10秒)后得到的时间
self.datePicker.minimumDate = minDate;
self.datePicker.maximumDate = maxDate;
__weak typeof(self)weakSelf=self;
//监听滚动
[self.datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSString *dateStr = [fmt stringFromDate:[NSDate date]];
//延迟1s中防止self还没被创建出来,出现野指针
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// weakSelf.selectDateBlock(dateStr);
[weakSelf.delegate LYBDatePickView:weakSelf datestr:dateStr type:weakSelf.type];
});
}
#pragma mark - 日期键盘滚动
- (void)dateChanged:(UIDatePicker *)datePicker{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSString *dateStr = [fmt stringFromDate:datePicker.date];
// self.selectDateBlock(dateStr);
[self.delegate LYBDatePickView:self datestr:dateStr type:self.type];
self.birthdayField.text = dateStr;
}
-(void)setSelecttype:(NSInteger)selecttype{
self.type=selecttype;
}
@end
UIDatePicker的介绍
UIDatePicker这个类的对象让用户可以在多个车轮上选择日期和时间。iPhone手机上的‘时钟’应用程序中的时间与闹铃中便使用了该控件。使用这个控件时,如果你能配置正确,当用户滚动车轮到一个新的日期或者时间上时,利用UIControlEventValueChanged触发事件。UIDatePicker给出了倒计时模式,但是并没有实现相关事件。如果你使用该模式,必须在应用程序中设置一个NSTime对象,让倒计时中的时间不断减少。
UIDatePicker的使用
创建并添加一个UIDatePicker对象
UIDatePicker *datePicker = [ [ UIDatePicker alloc] initWithFrame:CGRectMake(0,0,320,216)];
[self.view addSubview: datePicker];
配置UIDatePicker对象
1.日历属性
@property(nonatomic, copy) NSCalendar *calendar
相关说明:1.此属性的默认值对应于用户的当前日历,是在‘设置’这个应用程序中去设置的。
2.访问这个属性相当于调用 NSCalendar类的currentCalendar方法后时返回的值。
3.设置这个属性的值为nil,相当于使用它的默认值。
4.calendar属性指明了用于计算时间的文化细节,它指明了一年的开始和长度,一年中如何划分的方式。
2.日期属性
@property(nonatomic, strong) NSDate *date
相关说明:1.该属性的默认值是UIDatePicker对象创建时的日期。
2.该属性会在UIDatePickerModeCountDownTimer日期模式下被忽略;在该模型中,日期选择器开始于0:00。
3.设置该属性可以让时间选择器旋转到这个设置的日期与时间,但是不会产生动画效果。
4.如果要产生动画效果,需要使用 setDate:animated: 方法。
3.本地化属性
@property(nonatomic, strong) NSLocale *locale
相关说明:1.默认值是NSLocale类的currentLocale属性返回的值,或者是是时间选择器的日历所使用的本地化值。
2.本地化属性封装了关于语言和文化的层面,如日期的格式信息方式。
3.如果设备的‘设置’应用程序中地区选择“中国”时,NSLog(@"%@",[NSLocale currentLocale].localeIdentifier);返回的是@“zh_CN”。
4.在满足3的前提下,设置_datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];是多余的。
4.设置时间的方法
- (void)setDate:(NSDate *)date
animated:(BOOL)animated
相关说明:该方法用来设置一个新的时间并以动画的形式展示在时间选择器上面。(animated值为YES时,有动画)
5.时区属性
@property(nonatomic, strong) NSTimeZone *timeZone
相关说明:默认值是nil,意味着它利用的是NSTimeZone类的localTimeZone(本地时区)作为当前时区,或者是利用时间选择器的日历所使用的时区作为当前时区。
6.时间选择器的模式
@property(nonatomic) UIDatePickerMode datePickerMode
相关说明:1.这个属性指明以哪一种方式展示,只有时间、只有日期、既有日期又有时间、倒计时,这四种模式中的一种。
2.默认的模式为UIDatePickerModeDateAndTime(既有日期又有时间)。
3.UIDatePickerModeTime、UIDatePickerModeDate、UIDatePickerModeDateAndTime、UIDatePickerModeCountDownTimer。
7.最大显示时间属性
@property(nonatomic, strong) NSDate *maximumDate
相关说明:1.该属性值为NSDate对象,默认值是nil,nil意味着没有最大显示时间的约束。
2.该属性与最小显示时间属性(minimumDate)结合,表示一个有效的时间范围。
3.如果最小显示时间大于最大显示时间时,这两种性质都被忽略。
4.在倒计时模式(UIDatePickerModeCountDownTimer)下,最小显示时间和最大显示时间这两个属性都会被忽略。
8.最小显示时间属性
@property(nonatomic, strong) NSDate *minimumDate
相关说明:1.该属性值为NSDate对象,默认值是nil,nil意味着没有最小显示时间的约束。
2.该属性与最大显示时间属性(maximumDate)结合,表示一个有效的时间范围。
3.如果最小显示时间大于最大显示时间时,这两种性质都被忽略。
4.在倒计时模式(UIDatePickerModeCountDownTimer)下,最小显示时间和最大显示时间这两个属性都会被忽略。
9.间隔时间属性
@property(nonatomic) NSInteger minuteInterval
相关说明:1.使用该属性设置由分钟车轮显示的时间间隔。
2.间隔值必须均匀地分隔60,如果没有这样做,该属性将使用默认值为1。
3.该属性值的范围是大于等于1,并小于等于30。
10.倒计时秒数属性
@property(nonatomic) NSTimeInterval countDownDuration
相关说明:1.该属性设置倒计时需要倒计的秒数。
2.如果时间选择器的时间模式不是倒计时模式,则该属性会被忽略。
3.默认值是0.0,最大值为23:59(86399秒)。
获得时间数据
主动获取
直接通过访问时间选择器对象_datePicker的date属性获得NSDate类型的时间数据:
NSDate *theDate = _datePicker.date;//该属性返回选中的时间
NSLog(@"%@",[theDate descriptionWithLocale:[NSLocale currentLocale]]);//返回基于本地化的时间信息,其中NSLocale的静态方法currentLocale返回当前的NSLocale对象
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];//返回一个日期格式对象
dateFormatter.dateFormat = @"YYYY-MM-dd HH-mm-ss";//该属性用于设置日期格式为YYYY-MM-dd HH-mm-ss
NSLog(@"%@",[dateFormatter stringFromDate:theDate]);//该方法用于从日期对象返回日期字符串
监听获取
由于日期选择器是 UIControl的子类,因此可以可以监听它的行为(UIControlEventValueChanged):
[ _datePicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
- (void)dateChanged
{
NSDate *theDate = _datePicker.date;
NSLog(@"%@",[theDate descriptionWithLocale:[NSLocale currentLocale]]);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"YYYY-MM-dd HH-mm-ss";
NSLog(@"%@",[dateFormatter stringFromDate:theDate]);
}
四种时间模式的介绍
1.UIDatePickerModeTime
在这种模式下,显示时、分、AM/PM标志(可选)。具体的显示顺序取决于设备的本地化设置。
2.UIDatePickerModeDate
在这种模式下,显示年、月、日。具体的显示顺序取决于设备的本地化设置。
3.UIDatePickerModeDateAndTime
在这种模式下,显示日期的月、日、星期,时间的时、分、AM/PM标志(可选)。具体的显示顺序取决于设备的本地化设置。
4.UIDatePickerModeCountDownTimer
在这种模式下,显示时、分。应用程序必须实现一个计数器(NSTimer对象),让倒计时中的时间不断减少。
//选则出生日期
- (void)setBirthDayKeyBoard{
//设置上牌日期的inputview
self.datePicker = [[UIDatePickeralloc]init];
self.datePicker.datePickerMode =UIDatePickerModeDate;
self.datePicker.locale = [[NSLocalealloc]initWithLocaleIdentifier:@"zh_CN"];
NSCalendar *calendar = [[NSCalendaralloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponentsalloc]init];
//最小日期
components.year = 1979;
components.month = 1;
components.day = 1;
NSDate *minDate = [calendardateFromComponents:components];
//最大日期
NSDate *maxDate = [NSDatedate];
self.datePicker.minimumDate = minDate;
self.datePicker.maximumDate = maxDate;
//监听滚动
[self.datePickeraddTarget:selfaction:@selector(dateChanged:)forControlEvents:UIControlEventValueChanged];
}
#pragma mark - 日期键盘滚动
- (void)dateChanged:(UIDatePicker *)datePicker{
NSDateFormatter *fmt = [[NSDateFormatteralloc]init];
fmt.dateFormat =@"yyyy-MM-dd";
NSString *dateStr = [fmtstringFromDate:datePicker.date];
self.birthdayField.text = dateStr;
self.birthday = dateStr;
}