打卡记录、通用日历
因为日期格式为yyyy-MM-dd,所以日历可输入的日期范围为1000-9999年。
如果有需要也可以自己加几行代码调整为1-9999。公元前的,就比较难一点了,首先要对日历知识比较了解才行。
效果图
选中的日期显示白色阴影;选中某个日期时,底部显示其打卡信息。
效果2-无打卡记录&今天‘今天’是7月5号,显示半透明阴影。
主要构造:
scrollView做容器,设置pageEnale = YES,里面装3个固定、相同高度的日历控件monthView。从上到下依次为monthView1,monthView2,monthView3。也就是monthView2处于中间位置,并自动将scrollView滚动到中间。monthView2显示月份(比如当前月份)M7,monthView1装载上一个月M6,monthView3装载下一个月M8。总之monthView2是核心,是参考物。每次设定monthView2数据后以此计算出上、下月。
向上滚动到monthView1,可以看到M6月份日历,当滚动停止时,重新设定monthView的年月值,让monthView2显示M6月份,monthView1装载M5,monthView3装载M7;重新设置scrollview的contentOffset,让其滚动到monthView2。这样,当滚动停止时,用户一直看到的是M6月份日历,但实际monthView1控件已经被替换monthView2,这样一来,用户又可以向上、向下滚动了 !体验上会觉得是可无限滚动的日历!而且每次滚动后,其上下月份是正确、连续的。
底部是另外控件footerView,用于显示打卡信息。当monthView底部空白太多时,将footerView上移遮盖空白处。
monthView内部构造:
里面包含3个子图层,frame都是等于self.bounds
控件内包含42个日期,参见效果图1,6行,每行7个日期。根据条件显示、隐藏。
最底层:包含2个阴影showdowView,一个用来标识【今天】,一个用来标识(点击)选中的月份;通过隐藏、显示、坐标变换showdowView,去实现需求。
中间层:包含圆点,用于标识打卡状态;打卡正常,显示浅蓝圆点;打卡异常,显示红色;无打卡记录,隐藏圆点。
网友评论