iOS之日歷開發(fā)

我們都知道,ios沒有日歷控件狡孔,要想在項(xiàng)目中加入日歷功能,就得自己開發(fā)蜂嗽。github上面也有很多大神封裝好的日歷控件苗膝,但是感覺用別人的改起來總是不太好,所以決定自己手動(dòng)開發(fā)一個(gè)日歷植旧。

開發(fā)思路:

日歷開發(fā)主要用的就是uicollectionview辱揭,對(duì)其進(jìn)行封裝處理离唐,還有使用NSCalendar的一些方法去計(jì)算數(shù)據(jù)。項(xiàng)目難點(diǎn)主要在于實(shí)現(xiàn)日歷可以左右無限滑動(dòng)问窃,這個(gè)可以用輪播方法進(jìn)行解決亥鬓。這邊博客主要是將開發(fā)思路,以及開發(fā)方法域庇,而github上的demo沒有進(jìn)行封裝嵌戈,因此你們?cè)趯W(xué)習(xí)日歷開發(fā)上才更容易看懂。這里我只寫一些主要的技術(shù)點(diǎn)听皿,具體實(shí)現(xiàn)大家可以下載我的demo進(jìn)行了解咕别。

技術(shù)點(diǎn)一:NSCalendar+JSCCalendar

我們先給NSCalendar增加一些方法,這里我用了分類思想写穴。為NSCalendar增加一分類JSCCalendar

技術(shù)點(diǎn)二.自定義UICollectionViewFlowLayout

為什么要自定義UICollectionViewFlowLayout呢?因?yàn)槲乙龅娜諝v是需要左右滑動(dòng)的雌贱,那么我們的collectview是肯定要設(shè)置為橫向滑動(dòng)嘍啊送,而如果設(shè)置橫向滑動(dòng),那么我們的item會(huì)怎樣展示呢欣孤,大家想一下馋没?想出問題沒?那如果我們?cè)谟胕tem的indexpath.item來作為數(shù)據(jù)展示的話降传,就會(huì)是下面這種效果了


因?yàn)檫@個(gè)是整體完成開發(fā)之后篷朵,又去改的UICollectionViewFlowLayout,因此沒有展示全婆排,但是可以看出CollectionView的item展示順序是從上往下從左往右開始排列的声旺,這樣會(huì)影響到我們對(duì)日歷數(shù)據(jù)源的讀取。

JSCCollectionViewFlowLayout.h文件

@interfaceJSCCollectionViewFlowLayout :UICollectionViewFlowLayout

//? ? 一頁顯示多少列

@property (nonatomic,assign) NSUInteger itemCountPerRow;

//? ? 一頁顯示多少行

@property (nonatomic,assign) NSUInteger rowCount;

JSCCollectionViewFlowLayout.m文件


以上自定義layou就可以讓CollectionView從左往右段只,從上往下進(jìn)行排列展示了腮猖。里面的方法看不懂沒關(guān)系,直接使用這個(gè)layout就可以赞枕。

技術(shù)點(diǎn)三:UICollectionViewCell展示

這里我說下兩個(gè)數(shù)據(jù)源澈缺,當(dāng)然具體獲得方法,在NSCalendar的分類中都可以找到炕婶。

?? _daysInMonth = [self.calendar threedateArray:_currentDate];

? ? NSDate*lastdate = [self.calendar lastMonth:_currentDate];

? ? NSDate*nextdate = [self.calendar nextMonth:_currentDate];

? ? _threedateArray= [NSArray arrayWithObjects:lastdate,_currentDate, nextdate,nil];


? ? NSArray* _daysInMonth;//三個(gè)月的日歷數(shù)據(jù)數(shù)組(例如:[ [1,2,3,...29,30,31],[1,2,3...28,29,30],[1,2,3...26,27,28] ])

? ? NSArray * _threedateArray;//三個(gè)月的今天數(shù)據(jù)數(shù)組(例如:2018-03-18姐赡,2018-04-18,2018-05-18)

技術(shù)點(diǎn)四:輪播實(shí)現(xiàn)無限左右滑動(dòng)


設(shè)置ContentOffset

#pragma mark - 設(shè)置collectionview的ContentOffset

- (void)repositionViews{

? ? [_collectionView setContentOffset:CGPointMake(self.view.frame.size.width*round(NUMBER_PAGES_LOADED/2), 0)];

}

這里解釋下柠掂,為何日歷能實(shí)現(xiàn)左右滑動(dòng)项滑,其實(shí)就是一個(gè)輪播效果,我們?cè)趯?duì)collectionview進(jìn)行了3個(gè)section的創(chuàng)建陪踩,同時(shí)將ContentOffset設(shè)置到self.view.frame.size.width杖们,我們的手機(jī)屏幕和collectionview應(yīng)該是這樣的:


那么悉抵,每次當(dāng)我們往右邊滑動(dòng)屏幕,這時(shí)候section0會(huì)慢慢出現(xiàn)在手機(jī)屏幕里摘完,一旦section0完全移動(dòng)到屏幕中間姥饰。

1.這時(shí)候我們馬上把當(dāng)前時(shí)間改為seciton0的時(shí)間3月,然后重新獲取到2月份孝治,3月份和4月份的數(shù)據(jù)放在數(shù)據(jù)源中

2.由于我們的滑動(dòng)列粪,contentofset的x已經(jīng)為0了,這時(shí)候在設(shè)置為self.view.frame.size.width谈飒,讓它回到屏幕中間

3.計(jì)算3月份的日歷是顯示幾行岂座,重新計(jì)算CollectionView的frame,計(jì)算萬不要用layoutIfNeeded方法杭措,因?yàn)橄乱徊轿覀兯⑿翪ollectionView數(shù)據(jù)源费什,frame自然會(huì)改變。

4.刷新數(shù)據(jù)手素。當(dāng)我們手動(dòng)設(shè)置contentofset回到中間之后鸳址,應(yīng)該會(huì)展示4月份的數(shù)據(jù)對(duì)吧,這時(shí)候我們r(jià)eloadData泉懦,那么CollectionView的數(shù)據(jù)源變了稿黍,就會(huì)顯示3月份的數(shù)據(jù)了。給用戶的效果就是無限滑動(dòng)了崩哩。

注意:reloadData的時(shí)候要在? performWithoutAnimation?里面巡球,因?yàn)椴贿@樣的話,當(dāng)我們的cell有過顏色渲染的時(shí)候邓嘹,刷新會(huì)出現(xiàn)閃爍

GitHub下載demo

這里我用了很多圖片酣栈,是因?yàn)椋野l(fā)現(xiàn)引用代碼的時(shí)候汹押,簡書會(huì)給我自動(dòng)刪除一些空格 導(dǎo)致我的方法調(diào)用等等出現(xiàn)問題钉嘹,所以如果有知道如果解決方法的小伙伴,麻煩給我說一下鲸阻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跋涣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸟悴,更是在濱河造成了極大的恐慌陈辱,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细诸,死亡現(xiàn)場離奇詭異沛贪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門利赋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來水评,“玉大人,你說我怎么就攤上這事媚送≈性铮” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵塘偎,是天一觀的道長疗涉。 經(jīng)常有香客問我,道長吟秩,這世上最難降的妖魔是什么咱扣? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮涵防,結(jié)果婚禮上闹伪,老公的妹妹穿的比我還像新娘。我一直安慰自己壮池,他們只是感情好祭往,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著火窒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驮肉。 梳的紋絲不亂的頭發(fā)上熏矿,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音离钝,去河邊找鬼票编。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卵渴,可吹牛的內(nèi)容都是我干的慧域。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼浪读,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼昔榴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碘橘,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤互订,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后痘拆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰禽,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吐葵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规揪。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖温峭,靈堂內(nèi)的尸體忽然破棺而出猛铅,到底是詐尸還是另有隱情,我是刑警寧澤诚镰,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布奕坟,位于F島的核電站,受9級(jí)特大地震影響清笨,放射性物質(zhì)發(fā)生泄漏月杉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一抠艾、第九天 我趴在偏房一處隱蔽的房頂上張望苛萎。 院中可真熱鬧,春花似錦检号、人聲如沸腌歉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘盖。三九已至,卻和暖如春凹蜂,著一層夾襖步出監(jiān)牢的瞬間馍驯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工玛痊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汰瘫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓擂煞,卻偏偏與公主長得像混弥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子对省,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容