ios 精简日历

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

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

https://files.cnblogs.com/ios8/calendar.zip

 

日历类初始化

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

 

    myCalendar = [[NSCalendaralloc]initWithCalendarIdentifier:NSGregorianCalendar];

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

    [myCalendarsetFirstWeekday:1];

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

    [myCalendarsetMinimumDaysInFirstWeek:1];

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

    [myCalendarsetTimeZone:[NSTimeZonetimeZoneWithAbbreviation:0]];

 

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

 

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

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

     例如smallerNSDayCalendarUnitlargerNSMonthCalendarUnit则返回的nsrangelengthdate所在的月里共有多少天。

     

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

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

     例如smallerNSDayCalendarUnitlargerNSMonthCalendarUnit则返回的 nsUIntegerdatedate所在的月里的第几天。

     

     -(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下载地址

点击打开链接

posted @ 2013-11-23 11:29  苹果吧  阅读(2505)  评论(0编辑  收藏  举报