因项目需求,需要用到一个时间选择器,设置最大可选时间与最小可选时间,其它无效不可选的时间需要‘干’掉!!!苦于找了一堆别人自定义的时间选择器,并没有符合要求的。故而:自己写了一个。只分享给有需要的人(demo已附上)。
先看效果:
我是个实在人。一步一步来,先上.h文件
@protocol JXYDatePickerDelegate <NSObject>
@optional
//选中日期
-(void)didSelectedDateString:(NSString *)dateString;
//取消日期
-(void)cancelDatePicker;
@end
@interface JXYDatePicker : UIView
//代理
@property (nonatomic ,weak)id<JXYDatePickerDelegate>delegate;
-(instancetype)initWithFrame:(CGRect)frame WithMinimumDate:(NSDate *)minimumDate maximumDate:(NSDate *)maximumDate;
@end
简单易懂!定义了一个代理及两个方法,分别对应确定按钮与取消按钮的点击操作。
公开了一个方法,即初始化这个时间选择器的方法,参数方别对应:frame,最小日期,最大日期。
.m文件中先要遵守两个协议:UIPickerViewDelegate与UIPickerViewDataSource。
接下来就是大展拳脚了!!!
初始化方法代码如下:
-(instancetype)initWithFrame:(CGRect)frame WithMinimumDate:(NSDate *)minimumDate maximumDate:(NSDate *)maximumDate{
if ([super initWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];
self.yearArray = [NSMutableArray array];
self.minMonthRemainingArray = [NSMutableArray array];
self.maxMonthRemainingArray = [NSMutableArray array];
self.minDayRemainingArray = [NSMutableArray array];
self.maxDayRemainingArray = [NSMutableArray array];
NSDate *tenYearsbefore = [NSDate dateWithTimeIntervalSinceNow:(-24 *3600 *365 * 10)];
NSDate *tenYearsLater = [NSDate dateWithTimeIntervalSinceNow:(24 *3600 *365 * 10)];
self.minimumDate = minimumDate?minimumDate:tenYearsbefore;//默认是10年前
self.maximumDate = maximumDate?maximumDate:tenYearsLater;//默认是10年后
[self initData];
[self setViews];
}
return self;
}
初始化方法中设置了默认最大时间最小时间,这个可以自行定义。使用者调用初始化方法如果不设置最大最小时间的话,就会自动使用默认。
代码就不全贴了,太多容易恶心到大家。贴一些比较重要的逻辑好了。
/**
* 返回有多少个月
*/
- (NSInteger)MonthInSelectYear{
NSInteger yearRow = [yearPicker selectedRowInComponent:0];
if ([self.yearArray[yearRow] integerValue] == minYear) {
return _minMonthRemainingArray.count;
}else if ([self.yearArray[yearRow] integerValue] == maxYear){
return _maxMonthRemainingArray.count;
}else {
return 12;
}
}
此方法是返回每年有几个月的,例如最小时间是2017-7-24,那么2017年就剩下6个月了。很好理解嘛!
/**
* 返回有多少天
*/
- (NSInteger)daysInSelectMonth{
NSInteger yearRow = [yearPicker selectedRowInComponent:0] % self.yearArray.count;
NSInteger monthRow = [monthPicker selectedRowInComponent:0] % 12;
if ([self.yearArray[yearRow] integerValue] == minYear) {
if ([self.minMonthRemainingArray[monthRow] integerValue] == minMonth) {
return _minDayRemainingArray.count;
}else{
NSInteger monthRemainingDays = [self LeapYearCompare:[self.yearArray[yearRow] integerValue] withMonth:[self.minMonthRemainingArray[monthRow] integerValue]];
return monthRemainingDays;
}
}else if ([self.yearArray[yearRow] integerValue] == maxYear){
if ([self.maxMonthRemainingArray[monthRow] integerValue] == maxMonth){
return _maxDayRemainingArray.count;
}else{
NSInteger monthRemainingDays = [self LeapYearCompare:[self.yearArray[yearRow] integerValue] withMonth:[self.maxMonthRemainingArray[monthRow] integerValue]];
return monthRemainingDays;
}
}else{
NSInteger monthDays = [self LeapYearCompare:[self.yearArray[yearRow] integerValue] withMonth:monthRow + 1];
return monthDays;
}
}
每月返回多少天。不过多解释了,自己看吧!我这种菜13写的,你一定看得懂,看不懂就该转行了。
#pragma mark - 判断是否是闰年(返回的的值,天数)
- (NSInteger)LeapYearCompare:(NSInteger)year withMonth:(NSInteger)month{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return [self.leapYearArray[month - 1] integerValue];
}else{
return [self.NotLeapYearArray[month - 1] integerValue];
}
}
闰年就是针对2月啦。
接下来就是实现UIPickerViewDelegate,UIPickerViewDataSource的方法了
UIPickerViewDataSource:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
UIPickerViewDelegate:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view;
实现完了就可以用啦,几句代码就可以搞定:
NSDate *minimumDate = [NSDate dateWithTimeIntervalSinceNow:(24 * 3600 * 7)];
NSDate *maximumDate = [NSDate dateWithTimeIntervalSinceNow:(24 *3600 *365 *2)];
_JDatepicker = [[JXYDatePicker alloc]initWithFrame:CGRectMake(0, 100, SCREEN_WIDTH, datePickerH)WithMinimumDate:minimumDate maximumDate:maximumDate];
_JDatepicker.delegate = self;
[self.view addSubview:_JDatepicker];
好啦!随后附上demo。(已上传) //地址:https://github.com/FengziXiao/JxyDatePicker/tree/master
码农一枚。非常希望得到你的指点,如果能够帮到你,我也很欣慰!