如何在FSCalendar的shouldSelect方法中仅禁用过去日期
解决FSCalendar禁用过去日期的问题
别担心,这个需求其实很容易实现!你只需要在shouldSelect代理方法里做简单的日期对比,就能精准禁用今日之前的所有日期,同时保留今日及未来日期的选择权限。
具体代码实现
直接替换你的代理方法为下面的代码:
func calendar(_ calendar: FSCalendar, shouldSelect date: Date, at monthPosition: FSCalendarMonthPosition) -> Bool { // 获取当前日期的"午夜时刻"(也就是当天的起始时间) let todayStart = Calendar.current.startOfDay(for: Date()) // 将选中的日期也转换为当天的起始时间,避免时间部分干扰对比 let selectedDayStart = Calendar.current.startOfDay(for: date) // 只要选中的日期起始时间 >= 今天的起始时间,就允许选择 return selectedDayStart >= todayStart }
为什么要这么写?
- 直接用
Date()对比会有问题:比如当前时间是下午2点,如果你选今天上午10点的日期,直接对比的话date < Date()会返回true,导致今天的日期也被禁用。 - 用
startOfDay(for:)把两个日期都统一转换为当天的0点,这样整个今天的所有时刻都会被判定为"大于等于今天",保证今天可以正常选择,而昨天及更早的日期会被彻底禁用。
额外调整
如果你的需求是连今天也禁用,只需要把判断条件改成:
return selectedDayStart > todayStart
内容的提问来源于stack exchange,提问作者Дмитрий Деникаев
相关产品推荐
相关产品推荐

