直接贴代码吧,有用不到的地方 自己处理删除
@interface CanlendarViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>
{
UIButton * selectedBtn;
UIView * month_top;
UIView * day_top;
UILabel * month_Lb;
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