近來(lái)項(xiàng)目中需要自定義日歷拆内,研究了一下栏尚,趁著這段時(shí)間不忙渤刃,寫一個(gè)簡(jiǎn)單的教程拥峦,基本能滿足的要求。
NSCalender
蘋果官方解釋為:NSCalendar對(duì)象封裝了關(guān)于計(jì)算時(shí)間系統(tǒng)的信息卖子,其中定義了一年的開(kāi)始略号、長(zhǎng)度和劃分。它們提供關(guān)于日歷的信息和對(duì)calendrical計(jì)算的支持洋闽,例如確定給定的calendrical單元的范圍玄柠,并在給定的絕對(duì)時(shí)間內(nèi)添加單元。
由此可以看出NSCalender的強(qiáng)大之處诫舅,廢話不多說(shuō)羽利,直接進(jìn)入正題。
先說(shuō)一下思路骚勘,我寫的主要是為了讓人能理解主要功能铐伴,所以盡量簡(jiǎn)化了撮奏,我把整個(gè)日歷分為上、下兩部分当宴,上部分是日期的展示畜吊、以及月份的增加跟減少,下部分是日歷的內(nèi)容户矢,主要講下部分玲献。
下部分分為UICollectionView + NSCalender,也就是展示 + 數(shù)據(jù)梯浪。
1.獲取一個(gè)NSCalender對(duì)象
[NSCalendar currentCalendar];
currentCalendar取得的值會(huì)一直保持在cache中,第一次取得以后如果用戶修改該系統(tǒng)日歷設(shè)定捌年,這個(gè)值也不會(huì)改變。
firstWeekday
設(shè)定每周的第一天從星期幾開(kāi)始挂洛,比如:
如需設(shè)定從星期日開(kāi)始礼预,則value傳入1
如需設(shè)定從星期一開(kāi)始,則value傳入2
minimumDaysInFirstWeek
設(shè)定作為(每年及每月)第一周必須包含的最少天數(shù)虏劲,比如:
如需設(shè)定第一周最少包括1天托酸,則value傳入1
2.獲取當(dāng)前月有多少天:
- (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
官方解釋為返回一個(gè)更小的日歷單元(比如一天)的絕對(duì)時(shí)間值的范圍,它可以在一個(gè)更大的日歷單元(例如一個(gè)月)中進(jìn)行柒巫,其中包括指定的絕對(duì)時(shí)間励堡。
3.得到這個(gè)月的第一天是星期幾:
先將self.calender轉(zhuǎn)換成NSDateComponents,再將之前的日期年堡掏、月賦值給新的NSDateComponents對(duì)象应结,最主要的是要將day設(shè)置為1,之后再進(jìn)行轉(zhuǎn)換泉唁,獲取月初第一天是星期幾鹅龄。
因?yàn)槲抑霸O(shè)置firstWeekday的月初是星期一,所以在W=7的時(shí)候亭畜,月初是星期天砾层,需要設(shè)置為0,是為了跟UICollectionView顯示的時(shí)候相對(duì)應(yīng)贱案。
4.改變?cè)路?/p>
通過(guò)改變?cè)路菥涂梢宰龅綍r(shí)間的日歷的切換了肛炮。
基本上一個(gè)日歷的主要功能就寫完了,還有其他的一些需求可以自行翻閱文檔查看宝踪。
demo地址:github.com/cxorange/Calender.git?