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

自定义FSCalendar事件圆点:按日期重复数显示最多3个圆点

解决FSCalendar按事件数量显示对应圆点的问题

我来帮你调整代码,实现按日期的事件实际出现次数(最多3个)显示对应数量圆点的需求。核心问题在于你现在的代码只是判断日期是否存在,没有统计重复次数,所以没法精准控制圆点数量。

第一步:重构数据统计方式

首先我们需要统计每个日期的事件出现次数,用字典来存储会更高效,避免每次都遍历数组。你可以把原来的两个数组合并,直接基于所有事件日期统计:

// 合并所有事件日期(包含重复项)
let allEventDates = datesWithEvent + datesWithMultipleEvents
// 创建字典存储每个日期对应的事件次数
var dateEventCount: [String: Int] = [:]

// 遍历数组统计每个日期的出现次数
for dateStr in allEventDates {
    dateEventCount[dateStr, default: 0] += 1
}

如果你的两个数组是代表不同类型的事件,但需求是统计总次数,上面的合并方式就完全适用;如果有特殊区分逻辑,你可以调整统计规则。

第二步:修改numberOfEventsFor方法

这个方法负责返回每个日期要显示的圆点数量,我们直接返回统计到的次数和3的最小值,就能满足“2次显示2个,3次及以上显示3个”的要求:

func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
    let dateString = self.dateFormatter.string(from: date)
    // 获取该日期的事件次数,无事件则为0,取和3的最小值
    let eventCount = dateEventCount[dateString] ?? 0
    return min(eventCount, 3)
}

第三步:调整eventDefaultColorsFor方法

这个方法需要返回和圆点数量匹配的颜色数组,确保每个圆点都有对应的颜色:

func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, eventDefaultColorsFor date: Date) -> [UIColor]? {
    let dateString = self.dateFormatter.string(from: date)
    guard let eventCount = dateEventCount[dateString], eventCount > 1 else {
        // 事件次数为0或1时,返回nil使用默认颜色
        return nil
    }
    // 定义你想要的圆点颜色数组,取前N个(N是实际要显示的数量)
    let availableColors = [UIColor.magenta, appearance.eventDefaultColor, UIColor.black]
    return Array(availableColors.prefix(min(eventCount, 3)))
}

思路说明

  • 原来的代码用contains只能判断日期是否存在,无法统计重复次数,改成字典统计后能精准获取每个日期的事件数量。
  • 用min(eventCount, 3)直接控制最大显示3个圆点,完美贴合你的需求。
  • 颜色数组的长度和圆点数量对应,避免出现颜色数量和圆点数量不匹配的问题。

内容的提问来源于stack exchange,提问作者myapp store

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:09:59