如何为FSCalendar按日期序号配置周末与非周末日期颜色
为FSCalendar按日期序号循环配置日期颜色
嘿,这事儿好办!要实现「按日期序号循环,第5、6天(周末)设为红色,其余日期蓝色」的需求,我们可以借助FSCalendar的外观代理方法来搞定,具体步骤和代码示例如下:
核心思路
- 先确定一个起始周一作为第0天的基准日期;
- 计算每个日历日期距离这个起始日期的天数差(也就是你说的「日期序号」);
- 对天数差取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,提问作者Дмитрий Деникаев
相关产品推荐
相关产品推荐

