iOS程序猿swift

Swift日历控件

2018-04-08  本文已影响15人  Mhhhhhhy

记录一下项目中用到的日历控件

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还是要移动到中间,因为中间永远是当前月份

然后在此基础上就能实现各种各样产品老大提的恶心需求了

github:https://github.com/ywshemeng/customCalendar

上一篇 下一篇

猜你喜欢

热点阅读