Как отключить прошедшую дату в ckcalendar?

Я ищу, как отключить прошлые даты в CKCalendar. Например, я хочу отключить все даты до текущей даты. Только сегодняшняя дата и будущая дата должны быть кликабельными.

3 ответа

Решение

В дополнение к комментарию Ларма (установка calendar:willSelectDate для возврата NO для прошлых дат), если вы хотите настроить цвета для этих "отключенных дат", вы можете сделать это, настроив метод делегата configureDateItem: forDate:.

Пример:

- (void)calendar:(CKCalendarView *)calendar configureDateItem:(CKDateItem *)dateItem forDate:(NSDate *)date {

    if([date laterDate:minimumDate] == minimumDate) {
        dateItem.textColor = [UIColor grayColor];
    }
}

Приведенный выше код устанавливает цвет текста всех прошедших дат на серый.

Пример для метода делегата willSelectDate:

- (BOOL)calendar:(CKCalendarView *)calendar willSelectDate:(NSDate *)date {
    if ([date laterDate:minimumDate] == minimumDate) {
        return NO;
    }
    return [calendar dateIsInCurrentMonth:date];
}

Приведенный выше код отключает выбор всех прошедших дат.

Просто дайте это условие

calendar.onlyShowCurrentMonth=YES;

Если вы ищете решение SwiftUI..

Сначала вам нужно сделать частичный диапазон, если вы хотите, чтобы предыдущие даты не выбирались

      let dateRange: PartialRangeFrom<Date> = {
        let calendar = Calendar.current
        let startComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: Date.now)
        return calendar.date(from: startComponents)!...
    }()

затем вы можете настроить средство выбора даты, передавая диапазон, который вы только что создали

      DatePicker("", selection: $dueDate, in: dateRange)
           .datePickerStyle(.graphical)
           .labelsHidden()
Другие вопросы по тегам