iOS 时间选择器 支持月 日

直接贴代码吧,有用不到的地方 自己处理删除

@interface CanlendarViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>

{

    UIButton * selectedBtn;


    UIView * month_top;


    UIView * day_top;


    UILabel * month_Lb;

扫描二维码关注公众号,回复: 1084824 查看本文章


    UIButton * dayStart_btn;


    UIButton * dayEnd_btn;


    UIPickerView * pickerView_month;

    UIPickerView * pickerView_day;


    NSMutableArray * years_Muarr;


    NSMutableArray * months_MuArr;


    NSMutableArray * days_Arr;


    NSInteger minYear;//最早时间点年

    NSInteger minMonth;//最早时间点月

    NSInteger minDay;//最早时间点日

    NSInteger currentYear;//系统当前年

    NSInteger currentMonth;//系统当前月

    NSInteger currentDay;//系统当前日


    NSString * selectedYear;//当前选中的年

    NSString * selectedMonth;//当前选中的月

    NSString * selectedDay;//当前选中的日


    NSString * selectedYear_Month;//当前选中的年_月选择

}


@end


@implementation CanlendarViewController


- (void)rightItemButtonAction:(UIButton *)button

{

    NSString * blockStr = @"";

    if (selectedBtn.selected) {

        //按日

        NSDateFormatter * formatter = [[NSDateFormatter alloc]init];

        [formatter setDateFormat:@"yyyy.MM.dd"];


        NSDate * startDate = [formatter dateFromString:dayStart_btn.titleLabel.text];

        NSDate * endDate = [formatter dateFromString:dayEnd_btn.titleLabel.text];


        NSTimeInterval startTimeInter = [startDate timeIntervalSince1970];

        NSTimeInterval endTimeInter = [endDate timeIntervalSince1970];


        if (startTimeInter > endTimeInter) {

            blockStr = [NSString stringWithFormat:@"%@-%@",dayEnd_btn.titleLabel.text,dayStart_btn.titleLabel.text];

        }else{

            blockStr = [NSString stringWithFormat:@"%@-%@",dayStart_btn.titleLabel.text,dayEnd_btn.titleLabel.text];

        }

    }else{

        //按月

        blockStr = month_Lb.text;

    }


    if (self.SelectedBlock) {

        self.SelectedBlock(blockStr);

    }

    [self.navigationController popViewControllerAnimated:YES];

}

- (void)viewDidLoad {

    [super viewDidLoad];


    minYear = 2016;

    minMonth = 1;

    minDay = 1;

    [self currentYearAndMonthAndDay];


    [self setRightItemWithFrame:CGRectMake(0, 0, 30, 40) withImageName:nil withTitle:@"完成"];

    [self setLeftItemWithFrame:CGRectMake(0, 0, 30, 40) withImageName:nil withTitle:@"取消"];


    years_Muarr = [NSMutableArray arrayWithCapacity:0];

    months_MuArr = [NSMutableArray arrayWithCapacity:0];

    days_Arr = [NSMutableArray arrayWithCapacity:0];


    [self calculationYears];

    [self calculationMonthsAndDays];


    self.title = @"选择时间";

    [self setup];


    dayStart_btn.selected = YES;//默认开启起始日选中


}

- (void)calculationYears

{

    if (minYear == currentYear) {

        [years_Muarr addObject:[NSString stringWithFormat:@"%ld年",currentYear]];

    }else{

        for (int i = (int)minYear; i <= (int)currentYear; i ++) {

            [years_Muarr addObject:[NSString stringWithFormat:@"%d年",i]];

        }

    }

}

- (void)currentYearAndMonthAndDay

{

    NSDate * nowDate = [NSDate date];

    NSDateFormatter * formatter = [[NSDateFormatter alloc]init];

    [formatter setDateFormat:@"yyyy.MM.dd"];

    NSString * canlendarStr = [formatter stringFromDate:nowDate];


    NSArray * canlendarArr = [canlendarStr componentsSeparatedByString:@"."];

    currentYear = [canlendarArr[0] integerValue];

    currentMonth = [canlendarArr[1] integerValue];

    currentDay = [canlendarArr[2] integerValue];


    selectedYear_Month = canlendarArr[0];


    selectedYear = canlendarArr[0];

    selectedMonth = canlendarArr[1];

    selectedDay = canlendarArr[2];

}

- (void)setup

{

    selectedBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    selectedBtn.frame = CGRectMake(15, 30.5, 107, 27);

    [selectedBtn setTitle:@"按月选择" forState:UIControlStateNormal];

    [selectedBtn setTitle:@"按日选择" forState:UIControlStateSelected];

    [selectedBtn setImage:[UIImage imageNamed:@"changeBtn_canlendar"] forState:UIControlStateNormal];

    [selectedBtn setImage:[UIImage imageNamed:@"changeBtn_canlendar"] forState:UIControlStateSelected];

    [selectedBtn setTitleColor:UIColorWithRGBA(51, 51, 51) forState:UIControlStateNormal];

    [selectedBtn setTitleColor:UIColorWithRGBA(51, 51, 51) forState:UIControlStateSelected];

    [selectedBtn.titleLabel setFont:systemFont(13)];

    [selectedBtn setImageEdgeInsets:UIEdgeInsetsMake(7, 107 - 17 - 15, 7, 17)];

    [selectedBtn setTitleEdgeInsets:UIEdgeInsetsMake(7, - 40 7, 0)];

    selectedBtn.layer.cornerRadius = 13.5;

    selectedBtn.layer.borderColor = UIColorWithRGBA(209, 209, 209).CGColor;

    selectedBtn.layer.borderWidth = 1.0f;

    [selectedBtn addTarget:self action:@selector(selectedType:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:selectedBtn];

    

    [self creatDataPickerView];

}

- (void)creatDataPickerView

{

    if (!month_top) {

        month_top = [[UIView alloc]initWithFrame:CGRectMake(15, 97, SCREEN_WIDTH - 30, 30)];

        month_top.backgroundColor = [UIColor clearColor];

        [self.view addSubview:month_top];


        month_Lb = [UILabel creatLabelWithtext:UIColorWithRGBA(51, 51, 51) font:systemFont(16) text:[NSString stringWithFormat:@"%ld.%02ld",currentYear,currentMonth]];

        month_Lb.center = CGPointMake(month_top.center.x, 15);


        UIView * lineV = [[UIView alloc]initWithFrame:CGRectMake(0, 29.5, month_top.width, 0.5)];

        lineV.backgroundColor = UIColorWithRGBA(51, 51, 51);


        [month_top addSubview:month_Lb];

        [month_top addSubview:lineV];

    }


    if (!day_top) {

        day_top = [[UIView alloc]initWithFrame:CGRectMake(15, 97, SCREEN_WIDTH - 30, 30)];

        day_top.backgroundColor = [UIColor clearColor];

        [self.view addSubview:day_top];


        NSString * currentCanlendarStr = [NSString stringWithFormat:@"%ld.%02ld.%02ld",currentYear,currentMonth,currentDay];

        dayStart_btn = [UIButton buttonWithType:UIButtonTypeCustom];

        dayStart_btn.frame = CGRectMake(0, 0, day_top.width/2 - 17.5, day_top.height);

        [dayStart_btn setTitleColor:UIColorWithRGBA(209, 209, 209) forState:UIControlStateNormal];

        [dayStart_btn setTitleColor:UIColorWithRGBA(67, 212, 183) forState:UIControlStateSelected];

        dayStart_btn.titleLabel.font = systemFont(16);

        [dayStart_btn addTarget:self action:@selector(selectDayCanlendar:) forControlEvents:UIControlEventTouchUpInside];

        [dayStart_btn setTitle:currentCanlendarStr forState:UIControlStateNormal];

        [dayStart_btn setTitle:currentCanlendarStr forState:UIControlStateSelected];

        [day_top addSubview:dayStart_btn];


        dayEnd_btn = [UIButton buttonWithType:UIButtonTypeCustom];

        dayEnd_btn.frame = CGRectMake(day_top.width/2 + 17.5, 0, day_top.width/2 - 17.5, day_top.height);

        [dayEnd_btn setTitleColor:UIColorWithRGBA(209, 209, 209) forState:UIControlStateNormal];

        [dayEnd_btn setTitleColor:UIColorWithRGBA(67, 212, 183) forState:UIControlStateSelected];

        dayEnd_btn.titleLabel.font = systemFont(16);

        [dayEnd_btn addTarget:self action:@selector(selectDayCanlendar:) forControlEvents:UIControlEventTouchUpInside];

        [dayEnd_btn setTitle:currentCanlendarStr forState:UIControlStateNormal];

        [dayEnd_btn setTitle:currentCanlendarStr forState:UIControlStateSelected];

        [day_top addSubview:dayEnd_btn];



        UIView * lineV_left = [[UIView alloc]initWithFrame:CGRectMake(0, 29.5, day_top.width/2 - 17.5, 0.5)];

        lineV_left.backgroundColor = UIColorWithRGBA(51, 51, 51);

        UIView * lineV_right = [[UIView alloc]initWithFrame:CGRectMake(day_top.width/2 + 17.5, 29.5, day_top.width/2 - 17.5, 0.5)];

        lineV_right.backgroundColor = UIColorWithRGBA(51, 51, 51);


        UILabel * label = [UILabel creatLabelWithtext:UIColorWithRGBA(51, 51, 51) font:systemFont(18) text:@"至"];

        label.center = CGPointMake(day_top.width/2, 15);


        [day_top addSubview:dayStart_btn];

        [day_top addSubview:dayEnd_btn];

        [day_top addSubview:lineV_left];

        [day_top addSubview:lineV_right];

        [day_top addSubview:label];

        day_top.hidden = YES;

    }


    if (!pickerView_month) {

        pickerView_month = [[UIPickerView alloc]initWithFrame:CGRectMake(0, month_top.bottom + 37, SCREEN_WIDTH, 230.5)];

        pickerView_month.backgroundColor = [UIColor clearColor];

        pickerView_month.delegate = self;

        pickerView_month.dataSource = self;

        pickerView_month.showsSelectionIndicator = YES;

        [self.view addSubview:pickerView_month];

        [pickerView_month selectRow:years_Muarr.count -1 inComponent:0 animated:YES];

        [pickerView_month selectRow:months_MuArr.count -1 inComponent:1 animated:YES];

    }

    if (!pickerView_day) {

        pickerView_day = [[UIPickerView alloc]initWithFrame:CGRectMake(0, day_top.bottom + 37, SCREEN_WIDTH, 230.5)];

        pickerView_day.backgroundColor = [UIColor clearColor];

        pickerView_day.delegate = self;

        pickerView_day.dataSource = self;

        pickerView_day.showsSelectionIndicator = YES;

        pickerView_day.hidden = YES;

        [self.view addSubview:pickerView_day];

        [pickerView_day selectRow:years_Muarr.count - 1 inComponent:0 animated:YES];

        [pickerView_day selectRow:months_MuArr.count - 1 inComponent:1 animated:YES];

        [pickerView_day selectRow:days_Arr.count - 1 inComponent:2 animated:YES];

    }

}

- (void)selectedType:(UIButton *)btn

{

    btn.selected = !btn.selected;

    if (btn.selected) {

        //日

        day_top.hidden = NO;

        month_top.hidden = YES;

        pickerView_month.hidden = YES;

        pickerView_day.hidden = NO;

    }else{

        //月

        day_top.hidden = YES;

        month_top.hidden = NO;

        pickerView_month.hidden = NO;

        pickerView_day.hidden = YES;

    }

}

- (void)selectDayCanlendar:(UIButton *)btn

{

    [btn setTitleColor:UIColorWithRGBA(51, 51, 51) forState:UIControlStateNormal];

    if ([btn isEqual:dayStart_btn]) {

        dayStart_btn.selected = YES;

        dayEnd_btn.selected = NO;

    }else{

        dayStart_btn.selected = NO;

        dayEnd_btn.selected = YES;

    }

}

- (void)calculationMonthsAndDays

{

    NSDateFormatter * formatter = [[NSDateFormatter alloc]init];

    [formatter setDateFormat:@"yyyy.MM"];


    //获取date

    NSDate * date = [formatter dateFromString:[NSString stringWithFormat:@"%@.%@",selectedYear,selectedMonth]];


    //日历

    NSCalendar * calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];

    NSInteger days = range.length;



    [months_MuArr removeAllObjects];

    NSInteger months = 12;

    if ([selectedYear integerValue] == currentYear) {

        months = currentMonth;

        if ([selectedMonth integerValue] >= currentMonth) {

            days = currentDay;

        }

    }

    int num = 0;

    if ([selectedYear integerValue] == minYear) {

        num = (int)minMonth - 1;

    }

    for (int i = num; i < months; i++) {

        [months_MuArr addObject:[NSString stringWithFormat:@"%d月",i+1]];

    }

    [days_Arr removeAllObjects];

    for (int i = 0; i < days; i++) {

        [days_Arr insertObject:[NSString stringWithFormat:@"%d日",i+1] atIndex:i];

    }

    if (pickerView_day) {

        [pickerView_day reloadComponent:1];

        [pickerView_day reloadComponent:2];

    }

}

- (void)calculationMonthsforMonth

{

    NSDateFormatter * formatter = [[NSDateFormatter alloc]init];

    [formatter setDateFormat:@"yyyy"];


    //获取date

    NSDate * date = [formatter dateFromString:[NSString stringWithFormat:@"%@",selectedYear_Month]];


    //日历

    NSCalendar * calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];

    NSInteger days = range.length;



    [months_MuArr removeAllObjects];

    NSInteger months = 12;

    if ([selectedYear_Month integerValue] == currentYear) {

        months = currentMonth;

    }

    int num = 0;

    if ([selectedYear_Month integerValue] == minYear) {

        num = (int)minMonth - 1;

    }

    for (int i = num; i < months; i++) {

        [months_MuArr addObject:[NSString stringWithFormat:@"%d月",i+1]];

    }

    if (pickerView_month) {

        [pickerView_month reloadComponent:1];

    }

}

#pragma -----------------UIPickerViewDelegate,UIPickerDataSource----------

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    if ([pickerView isEqual:pickerView_month]) {

        return 2;

    }

    return 3;

}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

{

    if (component == 0) {

        return years_Muarr.count;

    }else if (component == 1) {

        return months_MuArr.count;

    }else{

        return days_Arr.count;

    }

}

-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component

{

    return 30.0f;

}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

{

    if (component == 0) {

        return years_Muarr[row];

    }else if (component == 1) {

        return months_MuArr[row];

    }else{

        return days_Arr[row];

    }

    return nil;

}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

{

    if ([pickerView isEqual:pickerView_month]) {

        if (component == 0) {

            selectedYear_Month = [years_Muarr[row] substringToIndex:4];

            [self calculationMonthsforMonth];

            [self calculationCanlendarWithYear:years_Muarr[row] Month:months_MuArr[[pickerView selectedRowInComponent:1]] Day:@"" pickerView:pickerView_month];

        }else if (component == 1) {

            [self calculationCanlendarWithYear:years_Muarr[[pickerView selectedRowInComponent:0]] Month:months_MuArr[row] Day:@"" pickerView:pickerView_month];

        }

    }else{

        if (component == 0) {

            selectedYear = [years_Muarr[row] substringToIndex:4];

            if ([months_MuArr[[pickerView selectedRowInComponent:1]] length] == 2) {

                selectedMonth = [NSString stringWithFormat:@"%02d",[[months_MuArr[[pickerView selectedRowInComponent:1]] substringToIndex:1] intValue]];

            }else{

                selectedMonth = [months_MuArr[[pickerView selectedRowInComponent:1]] substringToIndex:2];

            }

            [self calculationMonthsAndDays];

            [self calculationCanlendarWithYear:years_Muarr[row] Month:months_MuArr[[pickerView selectedRowInComponent:1]] Day:days_Arr[[pickerView selectedRowInComponent:2]] pickerView:pickerView_day];

        }else if (component == 1) {

            if ([months_MuArr[row] length] == 2) {

                selectedMonth = [NSString stringWithFormat:@"%02d",[[months_MuArr[row] substringToIndex:1] intValue]];

            }else{

                selectedMonth = [months_MuArr[row] substringToIndex:2];

            }

            [self calculationMonthsAndDays];

            [self calculationCanlendarWithYear:years_Muarr[[pickerView selectedRowInComponent:0]] Month:months_MuArr[row] Day:days_Arr[[pickerView selectedRowInComponent:2]] pickerView:pickerView_day];

        }else{

            [self calculationCanlendarWithYear:years_Muarr[[pickerView selectedRowInComponent:0]] Month:months_MuArr[[pickerView selectedRowInComponent:1]] Day:days_Arr[row] pickerView:pickerView_day];

        }

    }

}

- (void)calculationCanlendarWithYear:(NSString *)yearStr Month:(NSString *)monthStr Day:(NSString *)dayStr pickerView:(UIPickerView *)pickerView

{

    if ([pickerView isEqual:pickerView_month]) {

        if (yearStr.length > 0) {

            month_Lb.text = [month_Lb.text stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:[yearStr substringToIndex:4]];

        }

        if (monthStr.length > 0) {

            if (monthStr.length == 2) {

                monthStr = [NSString stringWithFormat:@"%02d",[[monthStr substringToIndex:1] intValue]];

            }else{

                monthStr = [monthStr substringToIndex:2];

            }

            month_Lb.text = [month_Lb.text stringByReplacingCharactersInRange:NSMakeRange(5, 2) withString:monthStr];

        }

        [month_Lb sizeToFit];

        month_Lb.center = CGPointMake(month_top.center.x, month_Lb.center.y);

    }else{

        if (dayStart_btn.selected) {

            if (yearStr.length > 0) {

                NSString * textStr = [dayStart_btn.titleLabel.text stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:[yearStr substringToIndex:4]];

                [dayStart_btn setTitle:textStr forState:UIControlStateSelected];

                [dayStart_btn setTitle:textStr forState:UIControlStateNormal];

            }

            if (monthStr.length > 0) {

                if (monthStr.length == 2) {

                    monthStr = [NSString stringWithFormat:@"%02d",[[monthStr substringToIndex:1] intValue]];

                }else{

                    monthStr = [monthStr substringToIndex:2];

                }

                NSString * textStr = [dayStart_btn.titleLabel.text stringByReplacingCharactersInRange:NSMakeRange(5, 2) withString:monthStr];

                [dayStart_btn setTitle:textStr forState:UIControlStateSelected];

                [dayStart_btn setTitle:textStr forState:UIControlStateNormal];

            }

            if (dayStr.length > 0) {

                if (dayStr.length == 2) {

                    dayStr = [NSString stringWithFormat:@"%02d",[[dayStr substringToIndex:1] intValue]];

                }else{

                    dayStr = [dayStr substringToIndex:2];

                }

                NSString * textStr = [dayStart_btn.titleLabel.text stringByReplacingCharactersInRange:NSMakeRange(8, 2) withString:dayStr];

                [dayStart_btn setTitle:textStr forState:UIControlStateSelected];

                [dayStart_btn setTitle:textStr forState:UIControlStateNormal];

            }

        }else{

            if (yearStr.length > 0) {

                NSString * textStr = [dayEnd_btn.titleLabel.text stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:[yearStr substringToIndex:4]];

                [dayEnd_btn setTitle:textStr forState:UIControlStateSelected];

                [dayEnd_btn setTitle:textStr forState:UIControlStateNormal];

            }

            if (monthStr.length > 0) {

                if (monthStr.length == 2) {

                    monthStr = [NSString stringWithFormat:@"%02d",[[monthStr substringToIndex:1] intValue]];

                }else{

                    monthStr = [monthStr substringToIndex:2];

                }

                NSString * textStr = [dayEnd_btn.titleLabel.text stringByReplacingCharactersInRange:NSMakeRange(5, 2) withString:monthStr];

                [dayEnd_btn setTitle:textStr forState:UIControlStateSelected];

                [dayEnd_btn setTitle:textStr forState:UIControlStateNormal];

            }

            if (dayStr.length > 0) {

                if (dayStr.length == 2) {

                    dayStr = [NSString stringWithFormat:@"%02d",[[dayStr substringToIndex:1] intValue]];

                }else{

                    dayStr = [dayStr substringToIndex:2];

                }

                NSString * textStr = [dayEnd_btn.titleLabel.text stringByReplacingCharactersInRange:NSMakeRange(8, 2) withString:dayStr];

                [dayEnd_btn setTitle:textStr forState:UIControlStateSelected];

                [dayEnd_btn setTitle:textStr forState:UIControlStateNormal];

            }

        }

    }

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];


}

@end



猜你喜欢

转载自blog.csdn.net/joyliyan/article/details/78668470