iOS swift自定义日历

swift自定义日历(暂不支持滑动切换)

拒绝转载,抄袭更不允许!!!!求别污染分享环境
原图是这样的
请添加图片描述

功能介绍

  1. 暂不支持滑动切换月份,navigator右边是切换月份,每切换一次的月份会网络请求新的数据。
  2. 当月的下一个月不能点击
  3. 星期六日样式不一样,点击到当前cell的样式不一样,还没到的日期样式不一样,且不能点击(这优先级高)
  4. 当月的话是默认点击当天的位置,若非本月默认第一个(可做有数据的第一个)
  5. 数据返回的不是以每一天来返回,要对数据的时间进行遍历分析
  6. 若点击到没有数据的cell,底部的信息框显示一样的信息

日历原理

其实就是一个collectionview,第一天在星期几为了前面空多少个,有多少天就是确定collectionview的item有多少个(第一天的index + 天数)。collectionviewDataSource负责处理返回的数据,这就要把返回的数据的时间转换成day,然后判断day是否等于显示的天相等。再把数据放入。collectionviewdelegate负责点击事件判断,已点、未点、不能点

时间逻辑核心代码(工具类)

有获取当前月、上下月的第一天是星期几,当前月有多少天,date转string,string转date

class DateTools: NSObject {
   
/// Date转换String
    ///
    /// - Parameters:
    ///   - date: 日期
    ///   - format: 格式
    /// - Returns: 字符串日期

    class func stringFromDate(date: Date, format: String = "yyyy-MM-dd HH:mm:ss") -> String {
   
        let formatter = DateFormatter.init()
        formatter.locale = Locale(identifier: "zh_CN")
        formatter.dateFormat = format
        let dateString = formatter.string(from: date)
        return dateString
    }
    
    /// 上个月
    ///
    /// - Parameter date: 当前日期
    /// - Returns: 上月日期
    class func lastMonth(_ date: Date) -> Date {
   
        var dateCom = DateComponents()
        dateCom.month = -1
        let newDate = (Calendar.current as NSCalendar).date(byAdding: dateCom, to: date, options: NSCalendar.Options.matchStrictly)
        return newDate!
    }
    
    /// 下个月
    ///
    /// - Parameter date: 当前日期
    /// - Returns: 下个月日期
    class func nextMonth(_ date: Date) -> Date {
   
        var dateCom = DateComponents()
        let abc = 1
        dateCom.month = +abc
        let newDate = (Calendar.current as NSCalendar).date(byAdding: dateCom, to: date, options: NSCalendar.Options.matchStrictly)
        return newDate!
    }
    
    /// 当月的天数
    ///
    /// - Parameter date: 日期
    /// - Returns: 天数
    class func daysInCurrMonth(date: Date) -> Int {
   
        let days: NSRange = (Calendar.current as NSCalendar).range(of: NSCalendar.Unit.day, in: NSCalendar.Unit.month, for: date)
        return days.length
    }
    
    /// 当前月份的第一天是周几
    ///
    /// - Parameter date: 当前日期
    /// - Returns: 周几
    class func firstDayIsWeekInMonth(date: Date) -> Int {
   
        var calender = Calendar.current
        calender.firstWeekday = 1
        var com = (calender as NSCalendar).components([NSCalendar.Unit.year, NSCalendar.Unit.month, NSCalendar.Unit.day], from: date)
        com.day = 1
        let firstDay = calender.date(from: com)
        let firstWeek = (calender as NSCalendar).ordinality(of: NSCalendar.Unit.weekday, in: NSCalendar.Unit.weekOfMonth, for: firstDay!)
        return firstWeek - 1
    }
    
    /// 当前月份的几号
    ///
    /// - Parameter date: 当前月份
    /// - Returns: 几号
    class func day
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值