最近接到一個項目凿宾,需要一個日歷的樣式兼蕊,所以從網(wǎng)上找了一個框架JTCalendar,并成功改成了項目需要的樣式产禾,在這里分享使用方法
1.集成框架
可以直接去Github下載 下載地址
將JTCalendar文件夾整個拖進(jìn)項目里即可
2.日歷的組成
1.日歷是由兩部分組成的,一個顯示月份的MenuView,一個顯示天數(shù)的ContentView.
所以我們需要創(chuàng)建兩個View
上面的菜單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];
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é)無止境,僅以自勉百侧!