记录一下项目中用到的日历控件
gif1.gif选择日期
QQ20180408-164058-HD.gif
日历主体是3个collectionView添加到scrollView上实现展示的
CalendarModel数据源
monthDate 该月的某一天 一般为x月15日
totalDays 当前月天数
firstWeekDay标示第一天是星期几(0代表周日,1代表周一,以此类推)
通过CalendarScrollView里面的monthArray保存显示的月份数据
假设今天是2012年12月12日,那么
monthArray = [
CalendarModel.init(11月),//前一月
CalendarModel.init(12月),//当前月
CalendarModel.init(1月),//下一月
10月份的天数
]
前三个是3个collection的数据源,最后一个做前一月中再前面一个月的最后几天用来补全日历的
即
2F4A32B3-3E92-4A06-A452-04C5527360EB.png
有了这些数据源就能显示出左中右3个日历了
本月
//12月的数据源
let monthInfo = monthArray[1] as! CalendarModel
// 当前日期所在月份第一天是周几
let firstWeekDay = monthInfo.firstWeekday
// 当前日期是所在月份的第几天
let totalDays = monthInfo.totalDays
//显示本月日期
if indexPath.item >= 第一周开始的位置 && indexPath.item < 第一周开始的位置 + 该月总天数 {
let today = indexPath.item - 第一周开始的位置 + 1//cell显示日期
}
//显示上个月日期 淡色显示
else if indexPath.item < firstWeekday {
let model = monthArray[0] as! CalendarModel//上一个月的数据源
let totalDay = model.totalDays//上一个月总天数
let today = totalDay - (firstWeekday - indexPath.item) + 1//cell显示日期
}
//显示下个月日期 淡色显示
else {
let today = indexPath.item - firstWeekday - totalDays + 1//cell显示日期
}
上个月和下个月在demo中
然后是滑动时的逻辑
左滑
假设 当天为 2012年12月12日 那么当前显示的日历为 11月 | 12月 | 1月
原本monthArray = [11月monthInfo, 12月monthInfo, 1月monthInfo, 10月份天数]
则滑动后monthArray = [10月monthInfo, 11月monthInfo, 12月monthInfo, 9月份天数]
且滑动完成后scrollView的contentOffSet还是要移动到中间,因为中间永远是当前月份
然后在此基础上就能实现各种各样产品老大提的恶心需求了
网友评论