因为项目需求,需要做个日历控件。
之前没做过,尝试自己写写试试。说写就写,开始动手。。。。
不过写之前需要先构想怎么写,想好了才动代码才能事半功倍。
首先是打算用到Storyboard和collectionView来做这个日历控件。其次需要有个NSDate的类别实现一些日历要用到的API。
下面开始动手:
1. NSDate的类别主要用到几个API:
1)通过年月获取当月的天数
+ (NSInteger)numberOfDaysByYear:(NSInteger )year month:(NSInteger)month;
2)通过年月获取当月第一天是星期几
+ (NSInteger)firstWeekdayFromYear:(NSInteger)year month:(NSInteger)month;
3)当前年月日。
2. StoryBoard中的设置
因为这边重点不是讲storyboard的操作,所以storyboard的具体拉约束的操作不讲,只讲讲思路。
1)首先需要一个头部view显示,显示当前年月和切换上下月。
2)再者是一个周日到周一的视图,这里需要7个视图等分,也是用autolayout拉约束。
3)最后是collectionView。
这里需要将collectionView拉进storyboard里,加好约束和设置好collectionView的layout,因为这里要做的是日历,item之间,所以我就如下设置:
min spaceing均为0,而size没关系,只是随便拿个值,具体的size需要在代理方法中设置,具体代码如下:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat width = collectionView.frame.size.width;
CGFloat cellWidth = (width - 20) / 7.0;
CGSize size = CGSizeMake(cellWidth, 40);
return size;
}
这里讲下日历从周几开始的实现思路,其实就是:1. 获取本月第一天周几,存为一个类型为NSInteger全局变量firstWeekday;2.获取本月天数monthDay;3.本月的collectionview需要的item数为firstweekday+monthday; 4. 最后就是在cellForItemAtIndexPath里面处理一下数据即可。
效果:
最后放上demo的github地址,有需要的自己拿吧。
这边文章只是我的学习过程和一点思路分析,希望对有需要的人有一丝帮助。