这两天需要做一个日历,自己研究了一下写了一个简单的Demo版本出来供大家参考,纯代码写的
首先,日历我是用collection view写的,其次,我用的是自带的date属性来获取数据的
最主要的方法就是获取数据源,下面是我注释的基本数据源方法
#pragma mark -- date
//得到今天是几号
- (NSInteger)day:(NSDate *)date{
NSDateComponents *components = [[NSCalendarcurrentCalendar]components:(NSCalendarUnitYear |NSCalendarUnitMonth |NSCalendarUnitDay) fromDate:date];
return [componentsday];
}
//得到今天是几月
- (NSInteger)month:(NSDate *)date{
NSDateComponents *components = [[NSCalendarcurrentCalendar]components:(NSCalendarUnitYear |NSCalendarUnitMonth |NSCalendarUnitDay) fromDate:date];
return [componentsmonth];
}
//得到今年是几年
- (NSInteger)year:(NSDate *)date{
NSDateComponents *components = [[NSCalendarcurrentCalendar]components:(NSCalendarUnitYear |NSCalendarUnitMonth |NSCalendarUnitDay) fromDate:date];
return [componentsyear];
}
//第一周的第一天在什么位置
- (NSInteger)firstWeekdayInThisMonth:(NSDate *)date{
NSCalendar *calendar = [NSCalendarcurrentCalendar];
[calendar setFirstWeekday:1];//1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat.
NSDateComponents *comp = [calendarcomponents:(NSCalendarUnitYear |NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [calendardateFromComponents:comp];
NSUInteger firstWeekday = [calendarordinalityOfUnit:NSCalendarUnitWeekdayinUnit:NSCalendarUnitWeekOfMonthforDate:firstDayOfMonthDate];
return firstWeekday -1;
}
//这个月有多少天
- (NSInteger)totaldaysInThisMonth:(NSDate *)date{
NSRange totaldaysInMonth = [[NSCalendarcurrentCalendar]rangeOfUnit:NSCalendarUnitDayinUnit:NSCalendarUnitMonthforDate:date];
return totaldaysInMonth.length;
}
//上个月的date数据(用于刷新)
- (NSDate *)lastMonth:(NSDate *)date{
NSDateComponents *dateComponents = [[NSDateComponentsalloc]init];
dateComponents.month = -1;
NSDate *newDate = [[NSCalendarcurrentCalendar]dateByAddingComponents:dateComponentstoDate:dateoptions:0];
return newDate;
}
//下个月的date数据(用于刷新)
- (NSDate*)nextMonth:(NSDate *)date{
NSDateComponents *dateComponents = [[NSDateComponentsalloc]init];
dateComponents.month = +1;
NSDate *newDate = [[NSCalendarcurrentCalendar]dateByAddingComponents:dateComponentstoDate:dateoptions:0];
return newDate;
}