·您现在的位置: 江北区云翼计算机软件开发服务部 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 简单日历的实现
1.初始化一些全局变量
1 _gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 2 _calendarDate = [NSDate date]; 3 _dayInfoUnits = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
2.获取本月第一天是星期几和本月的天数
1 //日期组件对象 2 NSDateComponents *components = [_gregorian components:_dayInfoUnits fromDate:_calendarDate]; 3 //获取到当月1号的当前时间 4 components.day = 1; 5 NSDate *firstDayOfMonth = [_gregorian dateFromComponents:components]; 6 [_gregorian rangeOfUnit:NSCalendarUnitMonth startDate:&firstDayOfMonth interval:NULL forDate:firstDayOfMonth]; 7 NSDateComponents *comps = [_gregorian components:NSCalendarUnitWeekday fromDate:firstDayOfMonth]; 8 //获取当月1号的星期,星期六对应的weekDay是7 9 NSInteger weekDayBegin = comps.weekday-1; 10 //获取当月的天数 11 NSInteger monthLength = [_gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:_calendarDate].length;
3.创建本月日历
1 //创建一个月的按钮 2 CGFloat buttonX = 0; 3 CGFloat buttonY = 0; 4 for (NSInteger i = 0; i<monthLength; i++) { 5 components.day = i+1; 6 NSInteger row = (i+weekDayBegin)/7; 7 NSInteger col = (i+weekDayBegin)%7; 8 buttonX = _dayWH*col; 9 buttonY = _dayWH*row; 10 CalendarButton *button = [self dayButtonWithFrame:CGRectMake(buttonX, buttonY, _dayWH, _dayWH)]; 11 button.title = [NSString stringWithFormat:@"%ld",components.day]; 12 button.tag = components.day; 13 if (col==0) { 14 button.titleColor = [UIColor colorWithRed:206/255.0 green:60/255.0 blue:81/255.0 alpha:1]; 15 } 16 if (button.tag == currentDay) { 17 button.titleColor = [UIColor orangeColor]; 18 } 19 [_calendarBtnView addSubview:button]; 20 }
4.创建需要显示的上个月的日历
1 //上个月的遗留日历 2 NSDateComponents *PReviousMonthComponents = [_gregorian components:_dayInfoUnits fromDate:_calendarDate]; 3 previousMonthComponents.month--; 4 NSDate *previousMonthDate = [_gregorian dateFromComponents:previousMonthComponents]; 5 NSRange previousMonthDays = [_gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:previousMonthDate]; 6 NSInteger maxDate = previousMonthDays.length - weekDayBegin; 7 for (NSInteger i = 0; i<weekDayBegin; i++) { 8 previousMonthComponents.day = maxDate+1+i; 9 buttonX = _dayWH*i; 10 buttonY = 0; 11 CalendarButton *previousCalendar = [self dayButtonWithFrame:CGRectMake(buttonX, buttonY, _dayWH, _dayWH)]; 12 previousCalendar.title = [NSString stringWithFormat:@"%ld",previousMonthComponents.day]; 13 previousCalendar.enabled = NO; 14 [_calendarBtnView addSubview:previousCalendar]; 15 }
5.创建需要现实的下个月的日历
//最后一周有多少天 NSInteger lastWeekDay = (weekDayBegin+monthLength)%7; //下个月开始日历 NSDateComponents *nextMonthComponents = [_gregorian components:_dayWH fromDate:_calendarDate]; nextMonthComponents.month++; NSInteger nextMonthDay = ShowDays-monthLength-weekDayBegin; for (NSInteger i=lastWeekDay; i<nextMonthDay+lastWeekDay; i++) { nextMonthComponents.day = i-lastWeekDay+1; NSInteger row = (i+weekDayBegin+monthLength-lastWeekDay)/7; NSInteger col = i%7; buttonX = _dayWH*col; buttonY = _dayWH*row; CalendarButton *nextMonthCalendar = [self dayButtonWithFrame:CGRectMake(buttonX, buttonY, _dayWH, _dayWH)]; nextMonthCalendar.title = [NSString stringWithFormat:@"%ld",nextMonthComponents.day]; nextMonthCalendar.enabled = NO; [_calendarBtnView addSubview:nextMonthCalendar]; }
6.切换至上个月或者下个月只需要将月份+1,-1,再重新创建日历按钮即可
NSDateComponents *components = [_gregorian components:_dayInfoUnits fromDate:_calendarDate]; components.day = 1; components.month --; NSDate *prevMonthDate = [_gregorian dateFromComponents:components]; _calendarDate = prevMonthDate;