You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:06:05