不啰嗦,直接上思路
時間選擇就不說了,界面固定的金度,說說日期選擇应媚。
日期選擇其實就是一個collectionView,collectionView的item數(shù)量猜极,取決與日歷的開始日期與結(jié)束日期中姜。
假設(shè)開始日期為1970-01-01,結(jié)束日期為當前日期
那item的數(shù)量 = 當前日期與開始日期相差的天數(shù) + 1 + 4(1970-01-01是星期四)跟伏,為什么要+1丢胚,自己領(lǐng)悟,如圖
接下來就是cell的賦值受扳,其實這個也是非常簡單的携龟,代碼如下,開始日期是星期幾就從第幾個cell開始賦值(星期日是第0個)勘高。開始日期+indexPath.item - 開始日期的星期峡蟋,就能得到該cell對應的日期,然后將日期中的多少號顯示在cell上就行了华望,如果是1號蕊蝗,就把月份也顯示出來
if (indexPath.item >= _firstWeekday) {
item.date = [DateTool date:self.startDate addDays:indexPath.item - _firstWeekday];
} else {
item.date = nil;
}
cell中的代碼
- (void)setDate:(NSDate *)date {
_date = date;
if (!date) {
_monthLabel.text = @"";
_dayLabel.text = @"";
return;
}
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
if (components.day == 1 || [[NSCalendar currentCalendar] isDateInToday:date]) {
_monthLabel.text = [NSString stringWithFormat:@"%@", self.months[components.month - 1]];
} else {
_monthLabel.text = @"";
}
_dayLabel.text = [NSString stringWithFormat:@"%ld", components.day];
}
上面說的這些都挺簡單的,接下來說說下面這個功能的實現(xiàn)赖舟,如圖
滾動collectionView的時候匿又,上面會出現(xiàn)對應的年份與月份,筆者的做法是建蹄,collectionView上面疊加了一個tableview,滾動collectionView的同時裕偿,同步滾動tableview洞慎。
這里的難點就在于同步,如何保證tableview上的日期與collectionView上的日期正好對應上嘿棘,進一步說劲腿,難點在于tableviewCell高度的計算,把tableviewCell的高度計算對了鸟妙,剩下的就簡單了
Cell高度的計算
其實在做之前焦人,筆者也覺得這個高度的計算一定很難,但是有了思路之后重父,發(fā)覺還是非常簡單的花椭,只要你不是數(shù)學白癡,就能看懂
以下面的圖為例:
我們先看第一個cell房午,這個cell的高度為collectionView中3個item的高度矿辽。
這個3是怎么算出來的?很簡單,開始日期我們知道袋倔,那我們就可以取出開始月份的最后一天雕蔽,這里是1974-11-30,然后我們計算出這個日期與開始日期相差的天數(shù) + 1 + 6(開始日期是周六)宾娜,然后(天數(shù) + 6)/ 7批狐,取整就可以得到3了,不要問我為什么+6前塔。
第二個cell高度的計算也類似嚣艇,不過這需要依賴第一個cell的高度,我們在開始日期的基礎(chǔ)上+1個月嘱根,取出這個月最后一天的日期并計算與開始日期相差的天數(shù)髓废,然后算出總高度,再用這個高度減去上一個cell的高度该抒,就可以得到第二個cell的高度了慌洪。
后面的以此類推,最后一個略有不同凑保,最后一個月不能取最后一天的日期冈爹,而是要取結(jié)束日期
這樣計算出來的cell的總高度最終與collectionView的contentSize.height是一樣的,所以要保證同步欧引,只需要在滾動collectionView的時候频伤,設(shè)置tableview的垂直偏移量與collectionView的一致就行了
結(jié)束語
表達的可能不是很清楚,有興趣研究的可以到筆者的github下載