IOS日历控件JTCalendar的使用

最近接到一个项目,需要一个日历的样式,所以从网上找了一个框架JTCalendar,并成功改成了项目需要的样式,在这里分享使用方法

1.集成框架

可以直接去Github下载 下载地址
将JTCalendar文件夹整个拖进项目里即可

2.日历的组成

1.日历是由两部分组成的,一个显示月份的MenuView,一个显示天数的ContentView.
所以我们需要创建两个View


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

上面的菜单View是我自定义的一个MenuView,并没有使用框架内自带的,因为框架内自带MenuView的没有左右点击切换月份,但是自带的MenuView是一个ScrollView,可以左右滚动进行月份切换,大家可以根据自己需求进行设置

3.代码实现日历的显示

首选需要导入JTCalendar.h文件
框架内有一个管理者,类似于AFN的Manager,我们需要通过这个Manager来进行ContentView的设置

//创建一个管理者,并且通过属性强引用,使其不会被释放
 @property (strong, nonatomic) JTCalendarManager *calendarManager;
//通过New语法来创建管理者
self.calendarManager = [JTCalendarManager new];
//设置需要显示月份的View,我这里是自定义的,所以注释掉了
//[self.calendarManager setMenuView:self.CalendarMenuView];
//设置需要显示日历的View
[self.calendarManager setContentView:self.calendarContentView];

注意需要显示日历的View,必须是JT框架内部的View,不同样式的日历View,需要绑定或创建JT内对应的View。需要什么样式的可以在框架内有案例显示。
我这里创建是可以选中的View所以创建了JTHorizontalCalendarView

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

4.设置设置日历需要显示的时间

我们改变日历显示的月份,也是通过这个方法来改变

//在日历显示初始化的时候就需要
[self.calendarManager setDate:[NSDate date]];

5.设置选中的日期

在控制器内我们可以创建一个结构体,用来做日历的数据源

{
   //有事件的时间数组,我暂时没用到
    NSMutableDictionary *_eventsByDate;
   //选中的时间数组,添加时间到这个数组里则可以显示红圈,也就是选中状态
    NSMutableArray *_datesSelected;
   //设置选中的模式,YES是选中模式,NO是全部不选中。
    BOOL _selectionMode;
}

6.刷新数据源并显示日期

//完成上面的设置后就可以进行数据刷新,显示日历了,类似TablView的刷新
[self ReloadDateTitle];
B755FD66-8EA5-4A4E-8CBF-115E70EE87A6.png

7.自定义样式

改变日历的样式,可以通过成为Manager的代理,通过代理方法进行修改,也可以通过直接暴力修改框架,来达到目的,这次我两种方式都使用到了

//成为管理者的代理,并遵守协议
self.calendarManager.delegate = self;
//改变日历的代理方法
- (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];
    }
    //这个为本月内第一个星期里上月日期的样式
    else if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){
        dayView.circleView.hidden = YES;
        dayView.dotView.backgroundColor = [UIColor redColor];
        dayView.textLabel.textColor = [UIColor lightGrayColor];
    }
    // 这个为下月内第一个星期里今天的样式
    else{
        dayView.circleView.hidden = YES;
        dayView.dotView.backgroundColor = [UIColor redColor];
        dayView.textLabel.textColor = [UIColor blackColor];
    }
    
    //日期有事件则显示个小红点,没有就不显示
    if([self haveEventForDay:dayView.date]){
        dayView.dotView.hidden = NO;
    }
    else{
        dayView.dotView.hidden = YES;
    }
    
    
}

上面是通过代理方法来改掉天数的样式,在项目里显示星期数需要中英文都显示,框架内只显示英文,如果需要改成我上面显示的中英文,就需要直接暴力修改框架了。

//通过查看UI图层可以知道显示周的View的类就是JTCalendarWeekDayView,我们就进JTCalendarWeekDayView里面进行修改
//首先查看他的layoutSubviews,因为子控件的布局都在这里
- (void)layoutSubviews
{
    [super layoutSubviews];
    //可以看到他的子控需要的数据都在这个数组里
    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循环进行的等宽高布局,所以我们也可以直接在layoutSubviews里添加自己的View来打到暴力修改的目的,很简单吧,我的代码就不上了,大家需要什么样的样式就在里面直接改就可以了,同理,DayView也是这样。

8.通过按钮来控制显示的月份

月份控制我是通过计算月份,然后设置Date刷新数据来实现的,也许有更高的办法,也可以在下方留言。

//首选我会在初始化日历控件的时候记录当前显示的时间
@property (strong, nonatomic) NSDate *Recordtime;
//初始化记录的时间
self.Recordtime = [NSDate date];
//然后在点击事件里进行时间的计算
- (IBAction)NextPageBtnClick:(id)sender {
    //通过系统的日历类来计算时间
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *comps = nil;
    //设置需要变更的时间,年,月,日,
    comps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:self.Recordtime];
    NSDateComponents *adcomps = [[NSDateComponents alloc] init];
    //因为我们只需要切换月份,所有直接把月数+1就可,其他为0
    [adcomps setYear:0];
    [adcomps setMonth:+1];
    [adcomps setDay:0];
    //获得增加后的时间并记录起来
    self.Recordtime = [calendar dateByAddingComponents:adcomps toDate:_Recordtime options:0];
    //设置日历当前显示的时间
    [self.calendarManager setDate:self.Recordtime];
    //刷新日历
    [self ReloadDateTitle];
    
}

9.总结

这个日历框架还是很方便实用的,在需要日历的项目里可以很方便的集成以及更改成自己需要的样式,每次多用一种框架就越感到自己什么都不会,大神是在太多了,学无止境,仅以自勉!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容