定制Github日历库EPCalendarPicker实现项目需求(三)

版权声明:大熊猫猪·侯佩原创或翻译作品.谢绝转载! hopy https://blog.csdn.net/mydo/article/details/82217371

三.按条件定制Cell选中颜色

前面说过了,EPCalendarPicker是可以定制Cell选中颜色的,但所有选中Cell只能是一种颜色。

因为App需要根据某天执行结果的成功与否设置对应的选中颜色,比如绿色代表成功,红色代表失败,透明色代表无结果。

所以当务之急是:如何随心所欲的设置任何选中的Cell为任何选中颜色!

这叫做:放开手,让用户自己决定!一般有两种实现方法:

  1. 设置回调闭包
  2. 设置回调方法

因为EPCalendarPicker有一个现成的协议,所以我们干脆用后者,在协议中新建一个方法:

@objc public protocol EPCalendarPickerDelegate{
    @objc optional    func epCalendarPicker(_: EPCalendarPicker, didCancel error : NSError)
    @objc optional    func epCalendarPicker(_: EPCalendarPicker, didSelectDate date : Date)
    @objc optional    func epCalendarPicker(_: EPCalendarPicker, didSelectMultipleDate dates : [Date])
    //新建如下方法
    @objc optional    func epCalendarPicker(_: EPCalendarPicker, bgColorFor date:Date)->UIColor?
}

注意该方法的签名,它返回一个可选的颜色对象,如果返回nil则表示没有选中的颜色,即透明色!否则我们需要用返回颜色来设置对应日期Cell的选中颜色。

现在的问题是在哪里,调用这个方法呢?

很简单,找到EPCalendarPicker渲染Cell的方法:

override open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

看一下其中的主条件判断块:

if indexPath.row >= prefixDays {
    //月中日期和月结尾不属于本月日期的处理
}else{
    //月开头不属于本月日期的处理
}

我们查看源代码可知,对于Cell的渲染主要分3部分:

  1. 特定月中的日期
  2. 上个月的日期,如果没有设置hideDaysFromOtherMonth则用浅灰色设置文字颜色,否则隐藏文字
  3. 下个月的日期,同上。

对于我们来说只需要在主条件块的main和else部分分别调用前面创建的回调方法即可:

if cell.lblDay.textColor != .clear{
    if let bgColor = calendarDelegate?.epCalendarPicker?(self, bgColorFor: currentDate){
        cell.selectedForLabelColor(bgColor)
    }
}

如上代码所示,因为如果Cell被隐藏,则其一定不能被选中,所以要跳过这种情况。

好啦,最后一步就是实际定制这个回调方法了,打开实现EPCalendarPickerDelegate代理的类,实现该方法:

extension HabitTracesViewController:EPCalendarPickerDelegate{
    func epCalendarPicker(_: EPCalendarPicker, bgColorFor date: Date) -> UIColor? {
        //根据date表示的天任务是否完成返回对应的颜色
        if let successed = habit.isEvaluateSuccessAt(day: date){
            if successed{
                //完成,返回绿色
                return UIColor.seaGreen()
            }else{
                //失败,返回红色
                return UIColor.indianRed()
            }
        }
        //无结果,无颜色!
        return nil
    }
}

让我们看一下实际的效果:


这里写图片描述

结尾

在这系列的3篇博文里,本猫向大家依次展示了定制第三方库的思路和实际步骤。现如今敏捷开发的时代,谁都不愿意再重复发明轮子,重用高质量的第三方代码,效率最大化的同时又可以从中吸取优秀的设计理念,编码方法,何乐而不为呢? ;)

感谢观赏。

猜你喜欢

转载自blog.csdn.net/mydo/article/details/82217371