http://www.th7.cn/Program/IOS/201311/160235.shtml

网上其他人写的日历类功能都很齐全,比较繁杂,对于想看看日历基础实现然后自己绘制日历的我来说不太方便,就自己整理了一个极精简的日历出来,大家看了之后应该能多少理解日历该怎么自定义,很简单。

我的小demo的源码  里边有详细的注释 

 

日历类初始化

//初始化日历类,并设置日历类的格式是阳历若想设置中国日历设置为NSChineseCalendar

 

myCalendar]initWithCalendarIdentifier:NSGregorianCalendar];

//设置每周的第一天从星期几开始2是周一

myCalendarsetFirstWeekday:1];

//设置每个月或者每年的第一周必须包含的最少天数1就是第一周至少要有一天

myCalendarsetMinimumDaysInFirstWeek:1];

//设置时区,不设置时区获取月的第一天和星期的第一天的时候可能会提前一天。  这个浪费我了不少时间

myCalendarsetTimeZone:[NSTimeZonetimeZoneWithAbbreviation:0]];

 

 日历类里比较重要的三个方法

 

     -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

该方法计算date所在的larger单位 里有几个  smaller单位。

例如smaller为NSDayCalendarUnit,larger为NSMonthCalendarUnit则返回的nsrange的length为date所在的月里共有多少天。

     

    -(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

该方法计算date 所在的smaller单位在 date所在的larger单位里的位置,即第几位。

例如smaller为NSDayCalendarUnit,larger为NSMonthCalendarUnit则返回的 nsUInteger为date是date所在的月里的第几天。

     

     -(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval )tip forDate:(NSDate *)date;

若datep 和 tip 可计算,则方法返回YES,否则返回NO。当返回YES时,可从datep里得到date所在的 unit单位的第一天。unit可以为 NSMonthCalendarUnit NSWeekCalendarUnit等

     

通过使用上边的这三个方法,可以获取到绘制月历所需要的全部数据。以日期2013/11/20为例(我把每个日期格子用button来显示,具体实现见demo):

通过     -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;可以得到11月共有多少天,知道一共要绘制多少个button。

通过    -(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval )tip forDate:(NSDate *)date;可以获取到 11月的第一天是哪一天。

通过     -(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;   可以得到 11月的第一天 是其所在周的第几天,从而可以知道绘制第一个button的位置。

然后就可以for循环画出11月所有的日期对用的button,用tag加以区分之后就可以实现各种功能了。

 

demo下载地址