用storyboard和collectionView 做个日历控件

因为项目需求,需要做个日历控件。
之前没做过,尝试自己写写试试。说写就写,开始动手。。。。
[TOC]
不过写之前需要先构想怎么写,想好了才动代码才能事半功倍。
首先是打算用到Storyboard和collectionView来做这个日历控件。其次需要有个NSDate的类别实现一些日历要用到的API。

下面开始动手:

NSDate的类别主要用到几个API:

  1. 通过年月获取当月的天数
    + (NSInteger)numberOfDaysByYear:(NSInteger )year month:(NSInteger)month;
  2. 通过年月获取当月第一天是星期几
    + (NSInteger)firstWeekdayFromYear:(NSInteger)year month:(NSInteger)month;
  3. 当前年月日。

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
这边文章只是我的学习过程和一点思路分析,希望对有需要的人有一丝帮助。

你可能感兴趣的:(用storyboard和collectionView 做个日历控件)