我的小demo的源码 里边有详细的注释
http://files.cnblogs.com/ios8/calendar.zip
myCalendar = [[NSCalendaralloc]initWithCalendarIdentifier:NSGregorianCalendar];
[myCalendarsetFirstWeekday: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等
通过 -(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加以区分之后就可以实现各种功能了。
点击打开链接