·您现在的位置: 江北区云翼计算机软件开发服务部 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 简单日历的实现

简单日历的实现

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

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;