版权声明:大熊猫猪·侯佩原创或翻译作品.谢绝转载! hopy https://blog.csdn.net/mydo/article/details/82217371
三.按条件定制Cell选中颜色
前面说过了,EPCalendarPicker是可以定制Cell选中颜色的,但所有选中Cell只能是一种颜色。
因为App需要根据某天执行结果的成功与否设置对应的选中颜色,比如绿色代表成功,红色代表失败,透明色代表无结果。
所以当务之急是:如何随心所欲的设置任何选中的Cell为任何选中颜色!
这叫做:放开手,让用户自己决定!一般有两种实现方法:
- 设置回调闭包
- 设置回调方法
因为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部分:
- 特定月中的日期
- 上个月的日期,如果没有设置hideDaysFromOtherMonth则用浅灰色设置文字颜色,否则隐藏文字
- 下个月的日期,同上。
对于我们来说只需要在主条件块的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篇博文里,本猫向大家依次展示了定制第三方库的思路和实际步骤。现如今敏捷开发的时代,谁都不愿意再重复发明轮子,重用高质量的第三方代码,效率最大化的同时又可以从中吸取优秀的设计理念,编码方法,何乐而不为呢? ;)
感谢观赏。