简单日历的实现

1.初始化一些全局变量

_gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
_calendarDate = [NSDate date];
_dayInfoUnits = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;

2.获取本月第一天是星期几和本月的天数

//日期组件对象
NSDateComponents *components = [_gregorian components:_dayInfoUnits fromDate:_calendarDate];
//获取到当月1号的当前时间
components.day = 1;
NSDate *firstDayOfMonth = [_gregorian dateFromComponents:components];
[_gregorian rangeOfUnit:NSCalendarUnitMonth startDate:&firstDayOfMonth interval:NULL forDate:firstDayOfMonth];
NSDateComponents *comps = [_gregorian components:NSCalendarUnitWeekday fromDate:firstDayOfMonth];
//获取当月1号的星期,星期六对应的weekDay是7
NSInteger weekDayBegin = comps.weekday-1;
//获取当月的天数
NSInteger monthLength = [_gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:_calendarDate].length;

3.创建本月日历

//创建一个月的按钮
CGFloat buttonX = 0;
CGFloat buttonY = 0;
for (NSInteger i = 0; i<monthLength; i++) {
  components.day = i+1;
  NSInteger row = (i+weekDayBegin)/7;
  NSInteger col = (i+weekDayBegin)%7;
  buttonX = _dayWH*col;
  buttonY = _dayWH*row;
  CalendarButton *button = [self dayButtonWithFrame:CGRectMake(buttonX, buttonY, _dayWH, _dayWH)];
  button.title = [NSString stringWithFormat:@"%ld",components.day];
  button.tag = components.day;
  if (col==0) {
    button.titleColor = [UIColor colorWithRed:206/255.0 green:60/255.0 blue:81/255.0 alpha:1];
  }
  if (button.tag == currentDay) {
    button.titleColor = [UIColor orangeColor];
  }
	[_calendarBtnView addSubview:button];
}

4.创建需要显示的上个月的日历

//上个月的遗留日历
NSDateComponents *previousMonthComponents = [_gregorian components:_dayInfoUnits fromDate:_calendarDate];
previousMonthComponents.month--;
NSDate *previousMonthDate = [_gregorian dateFromComponents:previousMonthComponents];
NSRange previousMonthDays = [_gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:previousMonthDate];
NSInteger maxDate = previousMonthDays.length - weekDayBegin;
for (NSInteger i = 0; i<weekDayBegin; i++) {
	previousMonthComponents.day = maxDate+1+i;
	buttonX = _dayWH*i;
  buttonY = 0;
  CalendarButton *previousCalendar = [self dayButtonWithFrame:CGRectMake(buttonX, buttonY, _dayWH, _dayWH)];
  previousCalendar.title = [NSString stringWithFormat:@"%ld",previousMonthComponents.day];
  previousCalendar.enabled = NO;
  [_calendarBtnView addSubview:previousCalendar];
}

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;
posted @ 2015-08-23 13:06  梦游的章鱼  阅读(539)  评论(0)    收藏  举报