服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS 简约日历控件EBCalendarView的实现代码

iOS 简约日历控件EBCalendarView的实现代码

2021-04-25 19:41我喝多了 IOS

本篇文章主要介绍了iOS 简约日历控件EBCalendarView的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了ios 简约日历控件ebcalendarview的实现代码,分享给大家,具体如下:

ebcalendarview日历控件,调用简单,代码简洁。

github地址:https://github.com/woheduole/ebcalendarview

效果图

iOS 简约日历控件EBCalendarView的实现代码

调用示例

?
1
2
3
4
5
6
7
8
ebcalendarview *calendarview = [[ebcalendarview alloc] initwithframe:cgrectmake(0, 64, cgrectgetwidth(self.view.bounds), 0)];
  calendarview.delegate = self;
  //calendarview.maxlastmonths = 0;
  //calendarview.maxnextmonths = 0;
  [self.view addsubview:calendarview];
- (void)calendarview:(ebcalendarview*)calendarview didselecteddate:(nsdate*)date {
  nslog(@"选中日期:%@", [date stringwithformat:@"yyyy-mm-dd"]);
}

代码目录

iOS 简约日历控件EBCalendarView的实现代码

思路

ebcalendarview

?
1
2
3
4
5
6
7
_collectionview = [[uicollectionview alloc] initwithframe:cgrectzero collectionviewlayout:self.flowlayout];
    _collectionview.datasource = self;
    _collectionview.delegate = self;
    _collectionview.showsverticalscrollindicator = no;
    _collectionview.showshorizontalscrollindicator = no;
    _collectionview.backgroundcolor = [uicolor whitecolor];
    [_collectionview registerclass:[ebcalendardaycell class] forcellwithreuseidentifier:kebcalendarviewreuseidentifier];

 

复制代码 代码如下:
_flowlayout.itemsize = cgsizemake(viewwidth / kebcalendarviewcellcolumn, kebcalendarviewcellheight);

 

通过uicollectionview控件去显示日期数据,设置uicollectionviewflowlayout的itemsize,高度可以固定,宽度就是用视图的总宽度去除以7。

?
1
2
3
4
5
6
7
// 小数向上取整
  nsinteger rows = ceilf(_dates.count / kebcalendarviewcellcolumn);
  self.frame = ({
    cgrect frame = self.frame;
    frame.size.height = kebcalendarviewweekviewheight + kebcalendernavigationviewheight + (rows * kebcalendarviewcellheight);
    frame;
  });

切换月份的时候,由于每月的1号所在星期是不一致的,会导致行数不一样,比如一个月是31天,它的1号是星期日,这时候日期会有6行,如果它的1号是星期一,那么它会显示5行,这里会根据行数去动态的改变其高度。

?
1
2
3
4
5
6
- (nsdate *)datebyaddingmonths:(nsinteger)months {
  nscalendar *calendar = [nscalendar currentcalendar];
  nsdatecomponents *components = [[nsdatecomponents alloc] init];
  [components setmonth:months];
  return [calendar datebyaddingcomponents:components todate:self options:0];
}

月份在累加或累减的时候,通过nscalendar类直接增加月数,这样就不用自己去处理2018-12点击下个月切换到2019-01或者2019-01点击上个月切换到2018-12的操作了。

ebcalendarmodel 数据模型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@property (nonatomic, assign) nsinteger year;
@property (nonatomic, assign) nsinteger month;
@property (nonatomic, assign) nsinteger day;
// 记录选中状态
@property (nonatomic, assign, getter=isselected) bool selected;
// 是否为当天
@property (nonatomic, assign, getter=istoday) bool today;
// 将year,month,day转换成nsdate
@property (nonatomic, strong, readonly) nsdate *date;
- (nsdate*)date {
  if (_year == 0 || _month == 0 || _day == 0) {
    return nil;
  }
  return [nsdate datewithstring:[nsstring stringwithformat:@"%zd-%zd-%zd"
              , _year
              , _month
              , _day] format:@"yyyy-mm-dd"];
}

ebcalenderweekview 周视图

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (void)layoutsubviews {
  [super layoutsubviews];
  [self createweekview];
}
 
- (void)setweeks:(nsarray *)weeks {
  _weeks = weeks;
  [self createweekview];
}
 
- (void)createweekview {
  cgfloat viewwidth = cgrectgetwidth(self.bounds)
  , viewheight = cgrectgetheight(self.bounds);
  if (_weeks.count == 0 || viewheight == 0) return;
  [self.subviews makeobjectsperformselector:@selector(removefromsuperview)];
  nsinteger weekcount = _weeks.count;
  cgfloat weekwidth = viewwidth / weekcount;
  for (int n = 0; n < weekcount; n ++ ) {
    nsstring *week = _weeks[n];
    uilabel *weeklabel = [[uilabel alloc] initwithframe:cgrectmake(weekwidth * n, 0, weekwidth, viewheight)];
    weeklabel.font = [uifont systemfontofsize:14];
    weeklabel.textcolor = [uicolor colorwithhexstring:@"333333"];
    weeklabel.textalignment = nstextalignmentcenter;
    weeklabel.text = week;
    [self addsubview:weeklabel];
  }
}

根据传入的参数weeks动态添加uilabel显示周数据。

ebcalendernavigationview 月份导航视图

?
1
2
3
4
5
6
7
8
9
10
- (void)changemonthaction:(uibutton*)button {
  bool isnextmonth = no;
  if ([button isequal:_nextmonthbutton]) {
    // 下个月
    isnextmonth = yes;
  }
  if ([self.delegate respondstoselector:@selector(calendernavigationviewdidchangemonth:isnextmonth:)]) {
    [self.delegate calendernavigationviewdidchangemonth:self isnextmonth:isnextmonth];
  }
}

这里面主要就显示左右箭头和中间的年月显示,左右箭头是两个uibutton,在点击它们的时候通过代理把动作给传到ebcalendarview视图。

uicolor+ebadd 颜色辅助类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+ (uicolor *)colorwithhexstring:(nsstring *)hexstring {
  nsscanner *scanner = [nsscanner scannerwithstring:hexstring];
  unsigned hexnum;
  if (![scanner scanhexint:&hexnum]) return nil;
  return [uicolor colorwithrgbhex:hexnum];
}
 
+ (uicolor *)colorwithrgbhex:(uint32)hex {
  int r = (hex >> 16) & 0xff;
  int g = (hex >> 8) & 0xff;
  int b = (hex) & 0xff;
  
  return [uicolor colorwithred:r / 255.0f
              green:g / 255.0f
              blue:b / 255.0f
              alpha:1.0f];
}

代码中颜色都是用的16进制的颜色值,纯属个人习惯。

nsdate+ebadd 日期辅助类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 该方法来源自yykit
- (nsinteger)year;
 
// 该方法来源自yykit
- (nsinteger)month;
 
// 该方法来源自yykit
- (nsinteger)day;
 
// 该方法来源自yykit
- (nsinteger)weekday;
 
// 该方法来源自yykit
- (bool)istoday;
 
// 当前月有多少天
- (nsuinteger)numberofdaysinmonth;
 
// 该方法来源自yykit
- (nsstring *)stringwithformat:(nsstring *)format;
 
// 该方法来源自yykit
- (nsdate *)datebyaddingmonths:(nsinteger)months;
 
// 该方法来源自yykit
+ (nsdate *)datewithstring:(nsstring *)datestring format:(nsstring *)format;

小结:uicollectionview很强大的一个控件,通过uicollectionviewflowlayout去重写布局,可以实现很多酷炫的功能。这里的日历控件只是设置了item的宽高,属于很基础的使用。其中需要注意两点:1.每个月的1号是属于周几,然后去设置它的起始位置;2.每个月有多少天。app类型不一样也会导致日历控件实际呈现方式不一样,基本逻辑都一样,无非就是一些细微的控制。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://juejin.im/post/5af059b76fb9a07aa43c24a3

延伸 · 阅读

精彩推荐
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17