用storyboard和collectionView 做个日历控件

因为项目需求,需要做个日历控件。

之前没做过,尝试自己写写试试。说写就写,开始动手。。。。


不过写之前需要先构想怎么写,想好了才动代码才能事半功倍。

首先是打算用到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地址,有需要的自己拿吧。

fisland/CalendarDemo · GitHub

这边文章只是我的学习过程和一点思路分析,希望对有需要的人有一丝帮助。

推荐阅读更多精彩内容