日历控件的实现
界面分析:
项目中所有的类信息
YWWeekTopView:顶部显示周几的信息
YWButton:日期按钮,处理显示的文字信息,点击效果
NSCalendar+YWDateConvertor :日期的处理
YWSingleMonthModel:获取单月界面显示需要的日期信息
YWSingleMonthView:YWButton的父视图,组成最终单月的界面
BTInfiniteScrollView: 第三方SrollView,实现无限滑动效果
YWCalendarViewController:日历控制器
文章仅提供思路,具体实现代码可到文章末尾点击链接下载,建议根据demo和文章结合。
界面实现一目了然,按上图分块,新建对应类实现需要的界面效果,然后再将各小块试图组装起来。
单个分析所有类:
一、YWWeekTopView效果如下,7个label并排放好搞定了。
二、YWButton如下图能看到多少小格子就有多少按钮,这个分类主要定义了两个对象,根据他们的set方法来对按钮界面做处理,dayDate根据传进来的日历,取日期的天作为按钮的Title,didSelected这里为了效果简单处理设置了如下图点击的按钮字体为白色且字体放大,没有被选中的字体黑子且字体变小。
@property (nonatomic) NSDate *dayDate;
@property (nonatomic) BOOL didSelected;
三、NSCalendar+YWDateConvertor,写了个NSCalendar的类目,用来处理时间数据,里面的详细时间处理从demo中可以一目了然,下图展示所有方法。
四、YWSingleMonthModel,(插句嘴:每个月需要显示的日期信息获取规则:本月一号不是周日,则前面显示上月信息,日期共显示六行,尾后由下月信息补全。)calendarStartDayDate当前界面第一个日期 (可能不是本月起时日,可能是上个月的某一天),根据这个时间数据结合NSCalendar+YWDateConvertor.h中如下方法,就可以获取一个月界面上需要显示的所有时间信息。
YWSingleMonthModel.h// 给定一年月日,返回第未来的N天, N为负值是表示过去的第N天,
- (NSDateComponents*)yw_dayFromDay:(NSDateComponents*)day withDayOffset:(NSInteger)dayOffset
五、YWSingleMonthView,摆放按钮,按钮界面数据显示根据YWSingleMonthModel中的calendarStartDayDate日期依次推算,代码更直观。
六、BTInfiniteScrollView的使用,主要实现其两个代理方法,方法作用一个返回需要显示的View,另一个是View显示后的回调可在里面做界面效果处理。第三方pod下载就可以了。
七、YWCalendarViewController控制器将上面的准备有序的排好,按照效果图设置坐标信息。其持有的对象如下:
大功告成,因为是闲来无事写的,有些粗糙,欢迎指导交流!