在iOS上實現乙個簡單的日曆控制項

2021-06-21 04:14:54 字數 2338 閱讀 8932

近期需要寫乙個互動有點dt的日曆控制項,具體互動細節這裡略過不表。

不過再怎麼複雜的控制項,也是由基礎的零配件組裝起來的,這裡最基本的就是日曆控制項。

先上圖:

從圖中可以看出日曆控制項就是由乙個個小方塊組成的,每一行有7個小方塊,分別表示一周的星期天到星期六。

給定乙個月份,我們首先需要知道這個月有多少周。那麼如何確定乙個月有多少周呢?

我是這麼想的,在nsdate上做擴充套件:

@inte***ce nsdate (wqcalendarlogic)
0. 首先需要知道這個月有多少天:

- (nsuinteger)numberofdaysincurrentmonth

1. 確定這個月的第一天是星期幾。這樣就能知道給定月份的第一周有幾天:

- (nsdate *)firstdayofcurrentmonth

- (nsuinteger)weeklyordinality

2. 減去第一周的天數,剩餘天數除以7,得到倍數和餘數:

- (nsuinteger)numberofweeksincurrentmonth

weeks += days / 7;

weeks += (days % 7 > 0) ? 1 : 0;

return weeks;

}

到這裡,就可以知道乙個月有多少行多少列,從而計算出需要多少個小方塊來展示:

@inte***ce wqcalendartileview : uiview
這些小方塊用乙個大方塊來承載:

@inte***ce wqcalendargridview : uiview

@property (nonatomic, weak) iddatasource;

@property (nonatomic, weak) iddelegate;

- (void)reloaddata;

和uitableview類似,當wqcalendargridview呼叫reloaddata介面時,會開始進行布局。而布局所需要的資訊由datasource和delegate提供:

@class wqcalendargridview;

@protocol wqcalendargridviewdatasource @required

- (nsuinteger)numberofrowsingridview:(wqcalendargridview *)gridview;

- (wqcalendartileview *)gridview:(wqcalendargridview *)gridview tileviewforrow:(nsuinteger)row column:(nsuinteger)column;

@optional

- (cgfloat)heightforrowingridview:(wqcalendargridview *)gridview;

@end

@protocol wqcalendargridviewdelegate - (void)gridview:(wqcalendargridview *)gridview didselectatrow:(nsuinteger)row column:(nsuinteger)column;

@end

每一行的高度,heightforrow,我比較傾向於由datasource提供 :)

第乙個datasource方法上面已經可以計算出來了,第二個datasource方法需要對每乙個tile進行配置,比如非當前月的以灰色展示,那麼我們就需要知道當前月展示中包含的 上個月殘留部分,和 下個月的開頭部分:

#pragma mark - method to calculate days in previous, current and the following month.

- (void)calculatedaysinpreviousmonthwithdate:(nsdate *)date

}- (void)calculatedaysincurrentmonthwithdate:(nsdate *)date

}- (void)calculatedaysinfollowingmonthwithdate:(nsdate *)date

}

到此,就可以順利地展現出給定月份的日曆控制項了。最近專案比較忙,隨手記一篇 :)

乙個簡單的日曆控制項

效果圖 var defaultdate new date var startyear,startmonth,startday 變數定義需要改一下,用default來定義當天的所有資訊 不能改變 var defaultmonth defaultdate.getmonth var defaultyear...

IOS上的個人實現日曆控制項

import define but textfontcolor uicolor colorwithred 1.0 green 1.0 blue 1.0 alpha 1.0 define but textfontcolor highlight uicolor colorwithred 0 green ...

iOS 在每乙個cell上新增乙個定時器的方案

1 首先建立乙個陣列,用來建立所有的定時器的時間 nsmutablearray totallasttime return totallasttime 2 當從網路請求過來時間之後,迴圈遍歷,行數和時間作為key,將值作為value放進字典中放進陣列 所有剩餘的時間 lasttime for int ...