因項(xiàng)目需求躯舔,需要用到一個(gè)時(shí)間選擇器,設(shè)置最大可選時(shí)間與最小可選時(shí)間省古,其它無(wú)效不可選的時(shí)間需要‘干’掉V嘧!豺妓!苦于找了一堆別人自定義的時(shí)間選擇器惜互,并沒有符合要求的。故而:自己寫了一個(gè)琳拭。只分享給有需要的人(demo已附上)训堆。
先看效果:
我是個(gè)實(shí)在人。一步一步來(lái)白嘁,先上.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
簡(jiǎn)單易懂坑鱼!定義了一個(gè)代理及兩個(gè)方法,分別對(duì)應(yīng)確定按鈕與取消按鈕的點(diǎn)擊操作絮缅。
公開了一個(gè)方法鲁沥,即初始化這個(gè)時(shí)間選擇器的方法,參數(shù)方別對(duì)應(yīng):frame耕魄,最小日期画恰,最大日期。
.m文件中先要遵守兩個(gè)協(xié)議:UIPickerViewDelegate與UIPickerViewDataSource吸奴。
接下來(lái)就是大展拳腳了2妗!奄抽!
初始化方法代碼如下:
-(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;//默認(rèn)是10年前
self.maximumDate = maximumDate?maximumDate:tenYearsLater;//默認(rèn)是10年后
[self initData];
[self setViews];
}
return self;
}
初始化方法中設(shè)置了默認(rèn)最大時(shí)間最小時(shí)間,這個(gè)可以自行定義甩鳄。使用者調(diào)用初始化方法如果不設(shè)置最大最小時(shí)間的話逞度,就會(huì)自動(dòng)使用默認(rèn)。
代碼就不全貼了妙啃,太多容易惡心到大家西疤。貼一些比較重要的邏輯好了。
/**
* 返回有多少個(gè)月
*/
- (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;
}
}
此方法是返回每年有幾個(gè)月的汉柒,例如最小時(shí)間是2017-7-24杨何,那么2017年就剩下6個(gè)月了。很好理解嘛叠殷!
/**
* 返回有多少天
*/
- (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;
}
}
每月返回多少天。不過(guò)多解釋了,自己看吧阿逃!我這種菜13寫的,你一定看得懂赃蛛,看不懂就該轉(zhuǎn)行了恃锉。
#pragma mark - 判斷是否是閏年(返回的的值,天數(shù))
- (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];
}
}
閏年就是針對(duì)2月啦。
接下來(lái)就是實(shí)現(xiàn)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;
實(shí)現(xiàn)完了就可以用啦破托,幾句代碼就可以搞定:
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
碼農(nóng)一枚土砂。非常希望得到你的指點(diǎn),如果能夠幫到你谜洽,我也很欣慰萝映!