如何移除FSCalendar中已变为当前日期的未来日期原有蓝色背景高亮
FSCalendar日期高亮冲突解决方案
出现该问题的本质是FSCalendar默认会保留所有历史选中日期的状态,且渲染优先级默认是选中态高于今日态,按以下步骤调整即可实现需求:
步骤1:替换默认选中状态存储
不要使用FSCalendar自带的selectedDates数组存储选中值,自己维护唯一的选中日期变量,避免旧选中值残留:
// Objective-C 声明 @property (nonatomic, strong) NSDate *selectedDate;
// Swift 声明 var selectedDate: Date?
步骤2:调整日期高亮渲染优先级
在calendar:appearance:fillDefaultColorForDate:代理方法中,优先渲染今日态,再处理选中态:
// Objective-C 实现 - (UIColor *)calendar:(FSCalendar *)calendar appearance:(FSCalendarAppearance *)appearance fillDefaultColorForDate:(NSDate *)date { // 优先匹配今日,固定显示红色高亮 if ([calendar isDateInToday:date]) { return [UIColor redColor]; } // 匹配选中日期,仅当选中日期非今日时显示蓝色高亮 if (self.selectedDate && [calendar isDate:date equalToDate:self.selectedDate toUnitGranularity:NSCalendarUnitDay]) { return [UIColor blueColor]; } // 其余日期返回默认填充色 return appearance.defaultDateFillColor; }
// Swift 实现 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, fillDefaultColorFor date: Date) -> UIColor? { // 优先匹配今日 if calendar.isDateInToday(date) { return .red } // 匹配选中日期 guard let selectedDate = selectedDate, calendar.isDate(date, equalTo: selectedDate, toGranularity: .day) else { return appearance.defaultDateFillColor } return .blue }
步骤3:处理跨天/刷新场景的状态清理
每次日历刷新、或者收到系统时间变更通知时,先校验选中日期是否已经变为今日,若为是则清空选中状态,再触发日历刷新:
// Objective-C 刷新方法 - (void)refreshCalendar { // 选中日期已变为今日时清空选中状态 if (self.selectedDate && [self.calendar isDateInToday:self.selectedDate]) { self.selectedDate = nil; } [self.calendar reloadData]; } // 监听系统时间变更(跨天场景) [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshCalendar) name:UIApplicationSignificantTimeChangeNotification object:nil];
// Swift 刷新方法 @objc func refreshCalendar() { if let selectedDate = selectedDate, calendar.isDateInToday(selectedDate) { self.selectedDate = nil } calendar.reloadData() } // 监听系统时间变更 NotificationCenter.default.addObserver(self, selector: #selector(refreshCalendar), name: UIApplication.significantTimeChangeNotification, object: nil)
注意事项
- 所有日期选中事件仅给自定义的
selectedDate赋值,不要调用FSCalendar的selectDate:方法添加多个选中值,避免状态混乱 - 选中日期的点击事件中,若点击的是今日,直接将
selectedDate置空即可,避免同时出现两个高亮
内容的提问来源于stack exchange,提问作者Suresh B
相关产品推荐
相关产品推荐

