从正确的开始日期开始定制iOS日历

从正确的开始日期开始定制iOS日历,ios,calendar,Ios,Calendar,我们的自定义日历必须与NSLocale一起使用,因此根据此区域设置从周一或周日开始更新。日历是一个充满按钮的自定义网格 我将实际天数的显示值改为-1,这看起来不错,但事实证明,改变天数本身确实很痛苦 我想根据区域设置将数字显示切换到正确的日期 因此,假设是2015年2月,如果周一是一周的开始,第一个周日应该只显示1,然后周一显示2 然而,我无法让我的按钮尊重这一事实,并最终在不同的日子里错误地显示天数 --编辑-- 我现在快到了。我已经让它展示了接近我期望的东西,但是第一天似乎从来没有展示过 请

我们的自定义日历必须与NSLocale一起使用,因此根据此区域设置从周一或周日开始更新。日历是一个充满按钮的自定义网格

我将实际天数的显示值改为-1,这看起来不错,但事实证明,改变天数本身确实很痛苦

我想根据区域设置将数字显示切换到正确的日期

因此,假设是2015年2月,如果周一是一周的开始,第一个周日应该只显示1,然后周一显示2

然而,我无法让我的按钮尊重这一事实,并最终在不同的日子里错误地显示天数

--编辑--

我现在快到了。我已经让它展示了接近我期望的东西,但是第一天似乎从来没有展示过

请注意,这是在我回顾下面的其他建议之前

 NSLocale *autoUpdating = [self getLocale];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setLocale:autoUpdating];

    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.month = self.currentMonth.month;
    components.year = self.currentMonth.year;
    components.day = 1;
    [components setWeekday:[calendar firstWeekday]];

    NSDate *firstDay = [calendar dateFromComponents:components];

    NSCalendarUnit units = (NSWeekdayCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit);
    NSDateComponents *dateComponents = [calendar components:units fromDate:firstDay];

    NSDateComponents *todayComponents = [calendar components:(NSCalendarUnitDay|NSCalendarUnitMonth|NSCalendarUnitYear) fromDate:[NSDate date]];

    NSDate *today = [calendar dateFromComponents:todayComponents];
    __unused NSDate *minimumDate = self.minimumDate ?: today;

    NSDate *selected = nil;

    if (self.selectedDate) {
        selected = [calendar dateFromComponents:self.selectedDate];
    }

    NSUInteger startDay = dateComponents.weekday;
    NSUInteger currentDay = calendar.firstWeekday;

    NSRange dayRange = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:firstDay];


    for (UIButton *button in self.dayButtons) {

        button.selected = NO;

        if ( ((button.tag + 1) >= startDay) && (currentDay <= dayRange.length) ) {

            NSString *title = [NSString stringWithFormat:@"%@", @(currentDay)];
            [button setTitle:title forState:UIControlStateNormal];
            [button setTitle:title forState:UIControlStateDisabled];


            dateComponents.day = currentDay;
            NSDate *date = [calendar dateFromComponents:dateComponents];

            if (selected && [date compare:selected] == NSOrderedSame) {
                button.selected = YES;
            }

            if ([date compare:minimumDate] == NSOrderedAscending) {
                button.enabled = NO;
            } else {
                button.enabled = YES;
            }


            currentDay++;
        } else {
            [button setTitle:@"" forState:UIControlStateNormal];
            [button setTitle:@"" forState:UIControlStateDisabled];
        }

我包含的图像显示它在2月不正确,我不知道如何修复它。

在尝试获取第一天时,为什么在组件上调用setWeekday:on?对于区域设置,月份的第一天并不总是在月份的第一个工作日。不确定。我以前真的没有用过日期。另外,对别人的代码进行重新装配,这样你就一直在更新问题中的代码,所以现在我的答案没有任何意义。我的区域设置是[NSLocale localeWithLocaleIdentifier:@de];我在某个地方有原始代码,我尝试了你的解决方案,它似乎有效