近来项目中需要自定义日历,研究了一下,趁着这段时间不忙,写一个简单的教程,基本能满足的要求。
NSCalender
苹果官方解释为:NSCalendar对象封装了关于计算时间系统的信息,其中定义了一年的开始、长度和划分。它们提供关于日历的信息和对calendrical计算的支持,例如确定给定的calendrical单元的范围,并在给定的绝对时间内添加单元。
由此可以看出NSCalender的强大之处,废话不多说,直接进入正题。
先说一下思路,我写的主要是为了让人能理解主要功能,所以尽量简化了,我把整个日历分为上、下两部分,上部分是日期的展示、以及月份的增加跟减少,下部分是日历的内容,主要讲下部分。
下部分分为UICollectionView + NSCalender,也就是展示 + 数据。
1.获取一个NSCalender对象
[NSCalendar currentCalendar];
currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。
firstWeekday
设定每周的第一天从星期几开始,比如:
如需设定从星期日开始,则value传入1
如需设定从星期一开始,则value传入2
minimumDaysInFirstWeek
设定作为(每年及每月)第一周必须包含的最少天数,比如:
如需设定第一周最少包括1天,则value传入1
2.获取当前月有多少天:
- (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
官方解释为返回一个更小的日历单元(比如一天)的绝对时间值的范围,它可以在一个更大的日历单元(例如一个月)中进行,其中包括指定的绝对时间。
3.得到这个月的第一天是星期几:
先将self.calender转换成NSDateComponents,再将之前的日期年、月赋值给新的NSDateComponents对象,最主要的是要将day设置为1,之后再进行转换,获取月初第一天是星期几。
因为我之前设置firstWeekday的月初是星期一,所以在W=7的时候,月初是星期天,需要设置为0,是为了跟UICollectionView显示的时候相对应。
4.改变月份
通过改变月份就可以做到时间的日历的切换了。
基本上一个日历的主要功能就写完了,还有其他的一些需求可以自行翻阅文档查看。