CVCalendar iOS在更改月份时禁用日期不起作用

时间:2016-09-02 16:53:09

标签: ios swift calendar nscalendar

我在iPhone应用中使用CVCalendar,并希望禁用超出范围的日期。日历上的日期只有在未来4到14天之间才能启用。我有一个名为disableOutsideDays()的函数试图完成此操作,但它只是偶尔工作,就像日历视图第一次出现时一样,但不是当用户滚动到下一个或前几个月时。

func disableOutsideDays() {
    let calendar = NSCalendar.currentCalendar()
    for weekV in calendarView.contentController.presentedMonthView.weekViews {
        for dayView in weekV.dayViews {


            if calendar.compareDate(dayView.date.convertedDate()!, toDate: NSDate(), toUnitGranularity: .Day) == .OrderedAscending || calendar.compareDate(dayView.date.convertedDate()!, toDate: calendar.dateByAddingUnit(.Day, value: 14, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))!, toUnitGranularity: .Day) == .OrderedDescending {
                dayView.userInteractionEnabled = false
                dayView.dayLabel.textColor = calendarView.appearance.dayLabelWeekdayOutTextColor
            }
        }
    }
}

我在viewDidLoad以及didShowNextMonthViewdidShowPreviousMonthView内拨打电话。奇怪的是,滚动到下个月可能会显示所有日期已启用(与我想要的相反),但滚动回当前月份并返回到下一个月再次显示为禁用。

1 个答案:

答案 0 :(得分:0)

对于CVCalendar,请使用此代码禁用特定范围之外的日期。

例如: 如果您希望用户访问 2017-08-22 2017-09-22 之间的所有日期,请在viewcontroller类中直接使用以下两个函数,其中包含开始日期和结束日期。

func earliestSelectableDate() -> Date {

        let dateStr = "2017-08-22 12:25:21 +0000" // Date after which all dates will get disabled

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"
        let date = dateFormatter.date(from:dateStr)!
        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
        let startDate = calendar.date(from:components)

        return startDate!
    }


func latestSelectableDate() -> Date {

        let dateStr = "2017-09-22 12:25:21 +0000"

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"
        let date = dateFormatter.date(from:dateStr)!
        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
        let finalDate = calendar.date(from:components)

        return finalDate!
    }

注意: - 这在周视图模式下无效