从正确的开始日期开始定制iOS日历
我们的自定义日历必须与NSLocale一起使用,因此根据此区域设置从周一或周日开始更新。日历是一个充满按钮的自定义网格 我将实际天数的显示值改为-1,这看起来不错,但事实证明,改变天数本身确实很痛苦 我想根据区域设置将数字显示切换到正确的日期 因此,假设是2015年2月,如果周一是一周的开始,第一个周日应该只显示1,然后周一显示2 然而,我无法让我的按钮尊重这一事实,并最终在不同的日子里错误地显示天数 --编辑-- 我现在快到了。我已经让它展示了接近我期望的东西,但是第一天似乎从来没有展示过 请注意,这是在我回顾下面的其他建议之前从正确的开始日期开始定制iOS日历,ios,calendar,Ios,Calendar,我们的自定义日历必须与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];我在某个地方有原始代码,我尝试了你的解决方案,它似乎有效