IOS日歷控件JTCalendar的使用

最近接到一個項目凿宾,需要一個日歷的樣式兼蕊,所以從網(wǎng)上找了一個框架JTCalendar,并成功改成了項目需要的樣式产禾,在這里分享使用方法

1.集成框架

可以直接去Github下載 下載地址
將JTCalendar文件夾整個拖進(jìn)項目里即可

2.日歷的組成

1.日歷是由兩部分組成的,一個顯示月份的MenuView,一個顯示天數(shù)的ContentView.
所以我們需要創(chuàng)建兩個View


4EF4F012-076E-44D7-87FA-82991B94C587.png

上面的菜單View是我自定義的一個MenuView,并沒有使用框架內(nèi)自帶的妄痪,因?yàn)榭蚣軆?nèi)自帶MenuView的沒有左右點(diǎn)擊切換月份楞件,但是自帶的MenuView是一個ScrollView,可以左右滾動進(jìn)行月份切換障簿,大家可以根據(jù)自己需求進(jìn)行設(shè)置

3.代碼實(shí)現(xiàn)日歷的顯示

首選需要導(dǎo)入JTCalendar.h文件
框架內(nèi)有一個管理者,類似于AFN的Manager栅迄,我們需要通過這個Manager來進(jìn)行ContentView的設(shè)置

//創(chuàng)建一個管理者,并且通過屬性強(qiáng)引用毅舆,使其不會被釋放
 @property (strong, nonatomic) JTCalendarManager *calendarManager;
//通過New語法來創(chuàng)建管理者
self.calendarManager = [JTCalendarManager new];
//設(shè)置需要顯示月份的View,我這里是自定義的憋活,所以注釋掉了
//[self.calendarManager setMenuView:self.CalendarMenuView];
//設(shè)置需要顯示日歷的View
[self.calendarManager setContentView:self.calendarContentView];

注意需要顯示日歷的View,必須是JT框架內(nèi)部的View,不同樣式的日歷View,需要綁定或創(chuàng)建JT內(nèi)對應(yīng)的View悦即。需要什么樣式的可以在框架內(nèi)有案例顯示。
我這里創(chuàng)建是可以選中的View所以創(chuàng)建了JTHorizontalCalendarView

@property (weak, nonatomic) IBOutlet JTHorizontalCalendarView *calendarContentView;

4.設(shè)置設(shè)置日歷需要顯示的時間

我們改變?nèi)諝v顯示的月份粱甫,也是通過這個方法來改變

//在日歷顯示初始化的時候就需要
[self.calendarManager setDate:[NSDate date]];

5.設(shè)置選中的日期

在控制器內(nèi)我們可以創(chuàng)建一個結(jié)構(gòu)體作瞄,用來做日歷的數(shù)據(jù)源

{
   //有事件的時間數(shù)組,我暫時沒用到
    NSMutableDictionary *_eventsByDate;
   //選中的時間數(shù)組乌庶,添加時間到這個數(shù)組里則可以顯示紅圈契耿,也就是選中狀態(tài)
    NSMutableArray *_datesSelected;
   //設(shè)置選中的模式,YES是選中模式糠赦,NO是全部不選中。
    BOOL _selectionMode;
}

6.刷新數(shù)據(jù)源并顯示日期

//完成上面的設(shè)置后就可以進(jìn)行數(shù)據(jù)刷新淌山,顯示日歷了顾瞻,類似TablView的刷新
[self ReloadDateTitle];
B755FD66-8EA5-4A4E-8CBF-115E70EE87A6.png

7.自定義樣式

改變?nèi)諝v的樣式,可以通過成為Manager的代理退渗,通過代理方法進(jìn)行修改蕴纳,也可以通過直接暴力修改框架,來達(dá)到目的翻翩,這次我兩種方式都使用到了

//成為管理者的代理稻薇,并遵守協(xié)議
self.calendarManager.delegate = self;
//改變?nèi)諝v的代理方法
- (void)calendar:(JTCalendarManager *)calendar prepareDayView:(JTCalendarDayView *)dayView
{
    //日期為今天的樣式
    if([_calendarManager.dateHelper date:[NSDate date] isTheSameDayThan:dayView.date]){
        dayView.circleView.hidden = NO;
        dayView.circleView.backgroundColor = RGBA(172, 176, 177, 1);
        dayView.dotView.backgroundColor = [UIColor whiteColor];
        dayView.textLabel.textColor = [UIColor whiteColor];
        
    }
    //日期為選中模式的樣式
    else if([self isInDatesSelected:dayView.date]){
        dayView.circleView.hidden = NO;
        dayView.circleView.backgroundColor = RGBA(227, 114, 127, 1);
        dayView.dotView.backgroundColor = [UIColor whiteColor];
        dayView.textLabel.textColor = [UIColor whiteColor];
    }
    //這個為本月內(nèi)第一個星期里上月日期的樣式
    else if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){
        dayView.circleView.hidden = YES;
        dayView.dotView.backgroundColor = [UIColor redColor];
        dayView.textLabel.textColor = [UIColor lightGrayColor];
    }
    // 這個為下月內(nèi)第一個星期里今天的樣式
    else{
        dayView.circleView.hidden = YES;
        dayView.dotView.backgroundColor = [UIColor redColor];
        dayView.textLabel.textColor = [UIColor blackColor];
    }
    
    //日期有事件則顯示個小紅點(diǎn)塞椎,沒有就不顯示
    if([self haveEventForDay:dayView.date]){
        dayView.dotView.hidden = NO;
    }
    else{
        dayView.dotView.hidden = YES;
    }
    
    
}

上面是通過代理方法來改掉天數(shù)的樣式,在項目里顯示星期數(shù)需要中英文都顯示案狠,框架內(nèi)只顯示英文,如果需要改成我上面顯示的中英文伴嗡,就需要直接暴力修改框架了从铲。

//通過查看UI圖層可以知道顯示周的View的類就是JTCalendarWeekDayView澄暮,我們就進(jìn)JTCalendarWeekDayView里面進(jìn)行修改
//首先查看他的layoutSubviews,因?yàn)樽涌丶牟季侄荚谶@里
- (void)layoutSubviews
{
    [super layoutSubviews];
    //可以看到他的子控需要的數(shù)據(jù)都在這個數(shù)組里
    if(!_dayViews){
        return;
    }

    CGFloat x = 0;
    CGFloat dayWidth = self.frame.size.width / NUMBER_OF_DAY_BY_WEEK;
    CGFloat dayHeight = self.frame.size.height / 2;
    CGFloat ChineseY = 0;
    CGFloat dayY = self.frame.size.height / 2;
    for(UIView *dayView in _dayViews){
        dayView.frame = CGRectMake(x, dayY, dayWidth, dayHeight);
        x += dayWidth;
    }
}

可以看到他的布局方式是通過for循環(huán)進(jìn)行的等寬高布局伸辟,所以我們也可以直接在layoutSubviews里添加自己的View來打到暴力修改的目的馍刮,很簡單吧,我的代碼就不上了静稻,大家需要什么樣的樣式就在里面直接改就可以了,同理杀迹,DayView也是這樣押搪。

8.通過按鈕來控制顯示的月份

月份控制我是通過計算月份,然后設(shè)置Date刷新數(shù)據(jù)來實(shí)現(xiàn)的大州,也許有更高的辦法厦画,也可以在下方留言。

//首選我會在初始化日歷控件的時候記錄當(dāng)前顯示的時間
@property (strong, nonatomic) NSDate *Recordtime;
//初始化記錄的時間
self.Recordtime = [NSDate date];
//然后在點(diǎn)擊事件里進(jìn)行時間的計算
- (IBAction)NextPageBtnClick:(id)sender {
    //通過系統(tǒng)的日歷類來計算時間
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *comps = nil;
    //設(shè)置需要變更的時間娃豹,年购裙,月,日躏率,
    comps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:self.Recordtime];
    NSDateComponents *adcomps = [[NSDateComponents alloc] init];
    //因?yàn)槲覀冎恍枰袚Q月份,所有直接把月數(shù)+1就可蓬抄,其他為0
    [adcomps setYear:0];
    [adcomps setMonth:+1];
    [adcomps setDay:0];
    //獲得增加后的時間并記錄起來
    self.Recordtime = [calendar dateByAddingComponents:adcomps toDate:_Recordtime options:0];
    //設(shè)置日歷當(dāng)前顯示的時間
    [self.calendarManager setDate:self.Recordtime];
    //刷新日歷
    [self ReloadDateTitle];
    
}

9.總結(jié)

這個日歷框架還是很方便實(shí)用的夯到,在需要日歷的項目里可以很方便的集成以及更改成自己需要的樣式,每次多用一種框架就越感到自己什么都不會阅爽,大神是在太多了荐开,學(xué)無止境,僅以自勉百侧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辫狼,隨后出現(xiàn)的幾起案子观话,更是在濱河造成了極大的恐慌,老刑警劉巖频蛔,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晦溪,死亡現(xiàn)場離奇詭異,居然都是意外死亡狞换,警方通過查閱死者的電腦和手機(jī)舟肉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黄琼,“玉大人整慎,你說我怎么就攤上這事】阍埃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淤袜。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么嚎研? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮论矾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饱亿。我一直安慰自己闰靴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布配猫。 她就那樣靜靜地躺著杏死,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腐巢。 梳的紋絲不亂的頭發(fā)上玄括,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音银还,去河邊找鬼洁墙。 笑死,一個胖子當(dāng)著我的面吹牛热监,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播列吼,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼苦始,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了理郑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柒爵,失蹤者是張志新(化名)和其女友劉穎赚爵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唁奢,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畸写,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年枯芬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千所。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡淫痰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出待错,到底是詐尸還是另有隱情,我是刑警寧澤犯建,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布瓜客,位于F島的核電站,受9級特大地震影響玻熙,放射性物質(zhì)發(fā)生泄漏疯攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一枚尼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姑原,春花似錦呜舒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至配名,卻和暖如春晋辆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓶佳。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工霸饲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厚脉。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓器仗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親精钮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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