Swift日历控件

作者: Mhhhhhhy | 来源:发表于2018-04-08 17:17 被阅读15次

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

    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

    相关文章

      网友评论

        本文标题:Swift日历控件

        本文链接:https://www.haomeiwen.com/subject/vbixixtx.html