因為項目需求,需要做個日歷控件。
之前沒做過,嘗試自己寫寫試試。說寫就寫,開始動手。。。。
[TOC]
不過寫之前需要先構(gòu)想怎么寫,想好了才動代碼才能事半功倍。
首先是打算用到Storyboard和collectionView來做這個日歷控件。其次需要有個NSDate的類別實現(xiàn)一些日歷要用到的API。
下面開始動手:
NSDate的類別主要用到幾個API:
- 通過年月獲取當(dāng)月的天數(shù)
+ (NSInteger)numberOfDaysByYear:(NSInteger )year month:(NSInteger)month; - 通過年月獲取當(dāng)月第一天是星期幾
+ (NSInteger)firstWeekdayFromYear:(NSInteger)year month:(NSInteger)month; - 當(dāng)前年月日。
StoryBoard中的設(shè)置
因為這邊重點不是講storyboard的操作,所以storyboard的具體拉約束的操作不講,只講講思路。
-
首先需要一個頭部view顯示,顯示當(dāng)前年月和切換上下月。
-
再者是一個周日到周一的視圖,這里需要7個視圖等分,也是用autolayout拉約束。
-
最后是collectionView。
這里需要將collectionView拉進storyboard里,加好約束和設(shè)置好collectionView的layout,因為這里要做的是日歷,item之間,所以我就如下設(shè)置:
min spaceing均為0,而size沒關(guān)系,只是隨便拿個值,具體的size需要在代理方法中設(shè)置,具體代碼如下:
- (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;
}
這里講下日歷從周幾開始的實現(xiàn)思路,其實就是:1. 獲取本月第一天周幾,存為一個類型為NSInteger全局變量firstWeekday;2.獲取本月天數(shù)monthDay;3.本月的collectionview需要的item數(shù)為firstweekday+monthday; 4. 最后就是在cellForItemAtIndexPath里面處理一下數(shù)據(jù)即可。
效果:

最后放上demo的github地址,有需要的自己拿吧。
fisland/CalendarDemo · GitHub
這邊文章只是我的學(xué)習(xí)過程和一點思路分析,希望對有需要的人有一絲幫助。


