美文网首页iOS 日记本App优化
iOS-日历选择基于UIPickerView封装

iOS-日历选择基于UIPickerView封装

作者: long弟弟 | 来源:发表于2018-08-23 22:22 被阅读0次

    八月湖水平,涵虚混太清。
    气蒸云梦泽,波撼岳阳城。
    欲济无舟楫,端居耻圣明。
    坐观垂钓者,徒有羡鱼情。---唐代·孟浩然《望洞庭湖赠张丞相》

    本文是参考OYDatePickerDatePicker

    本文算是简写了OYDatePicker,因为项目中既对农历无需求也不是取生日(包含今天和之前),而是对日期的预约(比如三天后)。所以本文只是对其中日期部分跟作者不同UI是Follow的。感谢ohyeahhh的开源!😄

    1.Demo体验
    2.代码整体思路

    • 搭建UI如下图:

    • 整体UI.png
    • 初始化数据

            self.year = _userSelectedYear;
            self.month = _userSelectedMonth;
            self.day = _userSelectedDay;
            
            [self.yqYearsArr removeAllObjects];
            for (NSInteger i = _userSelectedYear; i <= YQEndYearDefault; i++) { //多少年年
                [self.yqYearsArr addObject:[NSString stringWithFormat:@"%ld", i]];
            }
            
            [self.yqMonthsArr removeAllObjects];
            for (NSInteger i = _userSelectedMonth; i <= 12; i++) {
                [self.yqMonthsArr addObject:[NSString stringWithFormat:@"%ld", i]];
            }
            
            [self.yqDaysArr removeAllObjects];
            for (NSInteger i = _userSelectedDay; i <= 31; i++) {
                [self.yqDaysArr addObject:[NSString stringWithFormat:@"%ld", i]];
            }
    
    • 在UIPickerView的代理中更新数据源,如year、month和day的setter方法中;最后更新UI
    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
    
    • 最主要的操作是设置在年或者月的时候同步修改月或者日
    self.month = [self.yqMonthsArr[0] integerValue]; //同时将月份设置为第一行
    self.day = [self.yqDaysArr[0] integerValue]; //同时将日期设置为第一行
    

    3.使用方法,将YQDatePickerView的头文件和实现文件拖入到工程中。依赖Masonry和YYCategory(懒的写那个方法了,项目中没有的话就拖Demo中的即可)。视情况初始化、调用

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        self.yqPickerView.completionBlock = ^(NSString *componentsString) {
            NSLog(@"选择的是:%@", componentsString);
        };
        [self.yqPickerView show];
    }
    
    - (YQDatePickerView *)yqPickerView {
        if (_yqPickerView == nil) {
    //        NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:8 * 60 * 60];
    //        NSDate *date = [NSDate dateWithTimeInterval:3*24*60*60 sinceDate:localDate];
            //项目需求传入三天后
            NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3*24*60*60];
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
            //[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //格式化字符串会变成本地时间
            [dateFormatter setDateFormat:@"yyyy-MM-dd"];
            NSString *dateStr = [dateFormatter stringFromDate:date];
     
            NSArray *tmpArr = [dateStr componentsSeparatedByString:@"-"];
            NSInteger year = [tmpArr[0] integerValue];
            NSInteger month = [tmpArr[1] integerValue];
            NSInteger day = [tmpArr[2] integerValue];
            
            
            _yqPickerView = [[YQDatePickerView alloc]initWithUserFromYear:year AndMonth:month AndDay:day WithTitle:@"标题标题" WithBeginDateType:YQBeginDateFromDetailDate];
        }
        return _yqPickerView;
    }
    

    本文写的匆忙,重构优化的地方挺多的,欢迎大神PR、轻拍,多谢!

    相关文章

      网友评论

        本文标题:iOS-日历选择基于UIPickerView封装

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