如何为FSCalendar工作日设置背景色并保留选中日期高亮效果?
为FSCalendar工作日设置背景色并保留选中高亮效果
问题说明
在iOS应用中使用FSCalendar时,希望自定义周一至周五的日期单元格背景色,同时保留选中日期的橙色高亮效果。当前代码仅修改了顶部星期标题栏的标签背景色,无法实现日期区域的背景色设置。
当前使用的代码:
if let weekdayView = calendar.calendarWeekdayView { for label in weekdayView.weekdayLabels { label.backgroundColor = UIColor.lightGray.withAlphaComponent(0.2) // 修改星期标题背景色 label.textColor = .black label.layer.cornerRadius = 10 label.layer.masksToBounds = true } } calendar.appearance.selectionColor = UIColor.orange
解决方案
要实现日期单元格的背景色自定义,需要借助FSCalendarDelegateAppearance协议的代理方法,同时保证选中颜色的优先级。
步骤1:遵循代理协议
让视图控制器遵循FSCalendarDelegate和FSCalendarDelegateAppearance协议:
class YourViewController: UIViewController, FSCalendarDelegate, FSCalendarDelegateAppearance { // 关联日历控件 @IBOutlet weak var calendar: FSCalendar! override func viewDidLoad() { super.viewDidLoad() calendar.delegate = self // 保持选中日期的高亮颜色 calendar.appearance.selectionColor = .orange } }
步骤2:实现日期填充色代理方法
通过calendar:appearance:fillDefaultColorForDate:方法,为周一至周五的日期设置背景色,周末返回nil使用默认样式:
func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, fillDefaultColorFor date: Date) -> UIColor? { let sysCalendar = Calendar.current let weekday = sysCalendar.component(.weekday, from: date) // 注:Calendar.current的weekday取值为1(周日)、2(周一)...6(周五)、7(周六) if weekday >= 2 && weekday <= 6 { return UIColor.lightGray.withAlphaComponent(0.2) } return nil }
效果说明
- 周一至周五的日期单元格会显示浅灰色半透明背景
- 选中任意日期时,
selectionColor设置的橙色会自动覆盖背景色,保留高亮效果 - 顶部星期标题栏的样式可根据需要保留或删除原代码(如果不需要修改标题栏,可移除相关代码)
效果对比
- 原始效果:仅顶部星期标题标签有浅灰色背景,日期单元格无背景,选中日期为橙色高亮
- 预期效果:周一至周五的日期单元格有浅灰色半透明背景,选中日期保持橙色高亮
内容的提问来源于stack exchange,提问作者Sham Dhiman
相关产品推荐
相关产品推荐

