一個簡單的日歷選擇控件

不啰嗦,直接上思路

時間選擇就不說了,界面固定的,說說日期選擇。
日期選擇其實就是一個collectionView,collectionView的item數量,取決與日歷的開始日期與結束日期。

假設開始日期為1970-01-01,結束日期為當前日期
那item的數量 = 當前日期與開始日期相差的天數 + 1 + 4(1970-01-01是星期四),為什么要+1,自己領悟,如圖

接下來就是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];
}

上面說的這些都挺簡單的,接下來說說下面這個功能的實現,如圖


滾動collectionView的時候,上面會出現對應的年份與月份,筆者的做法是,collectionView上面疊加了一個tableview,滾動collectionView的同時,同步滾動tableview。

這里的難點就在于同步,如何保證tableview上的日期與collectionView上的日期正好對應上,進一步說,難點在于tableviewCell高度的計算,把tableviewCell的高度計算對了,剩下的就簡單了

Cell高度的計算

其實在做之前,筆者也覺得這個高度的計算一定很難,但是有了思路之后,發覺還是非常簡單的,只要你不是數學白癡,就能看懂

以下面的圖為例:


我們先看第一個cell,這個cell的高度為collectionView中3個item的高度。
這個3是怎么算出來的?很簡單,開始日期我們知道,那我們就可以取出開始月份的最后一天,這里是1974-11-30,然后我們計算出這個日期與開始日期相差的天數 + 1 + 6(開始日期是周六),然后(天數 + 6)/ 7,取整就可以得到3了,不要問我為什么+6。

第二個cell高度的計算也類似,不過這需要依賴第一個cell的高度,我們在開始日期的基礎上+1個月,取出這個月最后一天的日期并計算與開始日期相差的天數,然后算出總高度,再用這個高度減去上一個cell的高度,就可以得到第二個cell的高度了。

后面的以此類推,最后一個略有不同,最后一個月不能取最后一天的日期,而是要取結束日期

這樣計算出來的cell的總高度最終與collectionView的contentSize.height是一樣的,所以要保證同步,只需要在滾動collectionView的時候,設置tableview的垂直偏移量與collectionView的一致就行了

結束語

表達的可能不是很清楚,有興趣研究的可以到筆者的github下載

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Github地址:-CollectionViewLayout-CollectionViewFlowLayout- ...
    大沖哥閱讀 5,286評論 1 10
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,198評論 4 61
  • 我老公吧,給他發短信,他總是只看后半句,有時讓他帶兩三樣東西,他就只帶后面一樣。剛才在公交車上,一個婦女給她老公打...
    沙加之倫閱讀 142評論 0 0
  • 發展地講,所謂「高低貴賤」的存在是可以推動音樂向上發展的。問題本身沒有給出一個具體的切入點,自覺不應該不魯莽地回答...
    danniyeats閱讀 1,028評論 0 0
  • 南國的芙蓉城,這些年的冬天是少見有雪的,尤其是鵝毛大雪。 小時候卻幾乎是年年下雪。一下雪,就是孩子們的天堂,堆雪人...
    明月朗星閱讀 409評論 0 1