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

如何为FSCalendar按日期序号配置周末与非周末日期颜色

为FSCalendar按日期序号循环配置日期颜色

嘿,这事儿好办!要实现「按日期序号循环,第5、6天(周末)设为红色,其余日期蓝色」的需求,我们可以借助FSCalendar的外观代理方法来搞定,具体步骤和代码示例如下:

核心思路

  1. 先确定一个起始周一作为第0天的基准日期;
  2. 计算每个日历日期距离这个起始日期的天数差(也就是你说的「日期序号」);
  3. 对天数差取7的余数,余数为5或6时设置红色,其余情况设为蓝色。

Swift 实现示例

1. 定义起始基准日期

首先我们先设定一个起始的周一(你可以根据自己的需求调整这个日期,确保它是周一即可):

import FSCalendar

class YourViewController: UIViewController, FSCalendarDelegate, FSCalendarDelegateAppearance {
    @IBOutlet weak var calendar: FSCalendar!
    
    // 起始基准日期:第0天(周一)
    private let startDate: Date = {
        let calendar = Calendar.current
        var components = calendar.dateComponents([.year, .month, .day], from: Date())
        components.weekday = 2 // 注意:Calendar中周一对应数字2,周日是1
        return calendar.date(from: components)!
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 记得设置代理
        calendar.delegate = self
        calendar.appearanceDelegate = self
    }

2. 实现外观代理方法

通过这个方法来动态设置每个日期的标题颜色:

func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? {
        // 计算当前日期与起始日期的天数差(即日期序号)
        let dayOffset = Calendar.current.dateComponents([.day], from: startDate, to: date).day ?? 0
        // 对7取余,判断是否为周末序号(5、6)
        let remainder = dayOffset % 7
        return remainder == 5 || remainder == 6 ? .red : .blue
    }
}

Objective-C 实现示例

1. 定义起始基准日期

#import "FSCalendar.h"

@interface YourViewController () <FSCalendarDelegate, FSCalendarDelegateAppearance>
@property (weak, nonatomic) IBOutlet FSCalendar *calendar;
@property (nonatomic, strong) NSDate *startDate;
@end

@implementation YourViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.calendar.delegate = self;
    self.calendar.appearanceDelegate = self;
    
    // 初始化起始基准日期(周一)
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
    components.weekday = 2; // 周一对应数字2
    self.startDate = [calendar dateFromComponents:components];
}

2. 实现外观代理方法

- (UIColor *)calendar:(FSCalendar *)calendar appearance:(FSCalendarAppearance *)appearance titleDefaultColorForDate:(NSDate *)date {
    NSInteger dayOffset = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:self.startDate toDate:date options:0].day;
    NSInteger remainder = dayOffset % 7;
    return (remainder == 5 || remainder == 6) ? [UIColor redColor] : [UIColor blueColor];
}
@end

额外提示

  • 如果你的「第0天」是日历显示的第一个日期(且该日期是周一),可以直接把startDate替换为calendar.minimumDate;
  • 别忘了在项目中正确引入FSCalendar框架,确保代理协议已遵守;
  • 除了标题颜色,如果你还想修改日期的背景色,可以使用calendar(_:appearance:fillDefaultColorFor date:)方法,逻辑完全一致。

内容的提问来源于stack exchange,提问作者Дмитрий Деникаев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:36:24