美文网首页iOS开发记录iOS DeveloperiOS 知识点
iOS自定义时间选择器之隐藏不需要的时间

iOS自定义时间选择器之隐藏不需要的时间

作者: hello_bear | 来源:发表于2017-06-27 17:50 被阅读2293次

因项目需求,需要用到一个时间选择器,设置最大可选时间与最小可选时间,其它无效不可选的时间需要‘干’掉!!!苦于找了一堆别人自定义的时间选择器,并没有符合要求的。故而:自己写了一个。只分享给有需要的人(demo已附上)。
先看效果:


JDatepickerShow.gif

我是个实在人。一步一步来,先上.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
码农一枚。非常希望得到你的指点,如果能够帮到你,我也很欣慰!

相关文章

网友评论

    本文标题:iOS自定义时间选择器之隐藏不需要的时间

    本文链接:https://www.haomeiwen.com/subject/lvbxqxtx.html