在 iOS 日期选择器中设置最小和最大月份,但应更新选择器视图
Setting a minimum and maximum month in iOS date picker, but should update the picker view
当您 select 视图中的日期字段时,将显示日期选择器。我想限制滚动最少比当前月份少 2 个月,最多比当前月份多 4 个月。我见过类似的例子。例如:当前月份11月,月份范围应该是9月-明年3月。
我测试了 this 示例,但没有成功。
// Configure date picker
- (void) initializeDatePicker {
_datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 600, 160)];
_datePicker.backgroundColor = [UIColor whiteColor];
_datePicker.datePickerMode = UIDatePickerModeDate;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:-2];
NSDate *minDate = [gregorian dateByAddingComponents:comps toDate:currentDate options:0];
[comps setMonth:4];
NSDate *maxDate = [gregorian dateByAddingComponents:comps toDate:currentDate options:0];
_datePicker.minimumDate = minDate;
_datePicker.maximumDate = maxDate;
[_datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[_txfDateTextField setInputView:_datePicker];
selectedDate =[NSDate date];
}
更新:
上面的代码更新了日期选择器对象。但是,问题是日期选择器视图没有任何变化。上面的例子,我想让滚动条限制从九月滚动到明年三月。这样用户在滚动时就不会不知所措。从更好的 UX 角度来看。
好的,基于扩展的讨论,我现在明白目标是删除超出范围的月份。
标准日期选择器无法做到这一点。您必须使用 UIPickerView
.
构建自定义控件
简短的回答是,"Don't do that."
如果你想允许 2 个月后,4 个月前:
如果您当前的日期是 2016 年 11 月:
有效月份为 2016 年 9 月、10 月、11 月、2016 年 12 月以及 2017 年 1 月、2 月和 3 月。
因此,如果用户选择 2016 年,您需要使用九月、十月、十一月来填充月份选择器轮。那么如果用户切换到2017年,你需要重建只有一月、二月和三月的月轮。
但是,现在您没有使用日期选择器,您使用的是 UIPickerView
您想要像日期选择器一样。
因此,除了根据当前年份重建月份微调器之外,您还必须设法设置日期选择器以显示当前所选年份和月份的有效日期。大多数月份有 30 或 31 天,但二月份呢?闰年呢?不是闰年的世纪呢?
此外,您正在构建一个看起来像日期选择器的控件,并且有点,但不完全像一个日期选择器。
您要处理公历以外的日历吗?希伯来历、阿拉伯历、中国历呢?让所有这些正常工作的负担在你身上。
Apple 在可用性研究上投入了大量资金,并提出了一个运行良好的标准控件,并确实处理了不同日历系统的本地化等问题。
简而言之,这是您不想进入的兔子洞。
当您 select 视图中的日期字段时,将显示日期选择器。我想限制滚动最少比当前月份少 2 个月,最多比当前月份多 4 个月。我见过类似的例子。例如:当前月份11月,月份范围应该是9月-明年3月。
我测试了 this 示例,但没有成功。
// Configure date picker
- (void) initializeDatePicker {
_datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 600, 160)];
_datePicker.backgroundColor = [UIColor whiteColor];
_datePicker.datePickerMode = UIDatePickerModeDate;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:-2];
NSDate *minDate = [gregorian dateByAddingComponents:comps toDate:currentDate options:0];
[comps setMonth:4];
NSDate *maxDate = [gregorian dateByAddingComponents:comps toDate:currentDate options:0];
_datePicker.minimumDate = minDate;
_datePicker.maximumDate = maxDate;
[_datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[_txfDateTextField setInputView:_datePicker];
selectedDate =[NSDate date];
}
更新: 上面的代码更新了日期选择器对象。但是,问题是日期选择器视图没有任何变化。上面的例子,我想让滚动条限制从九月滚动到明年三月。这样用户在滚动时就不会不知所措。从更好的 UX 角度来看。
好的,基于扩展的讨论,我现在明白目标是删除超出范围的月份。
标准日期选择器无法做到这一点。您必须使用 UIPickerView
.
简短的回答是,"Don't do that."
如果你想允许 2 个月后,4 个月前:
如果您当前的日期是 2016 年 11 月:
有效月份为 2016 年 9 月、10 月、11 月、2016 年 12 月以及 2017 年 1 月、2 月和 3 月。
因此,如果用户选择 2016 年,您需要使用九月、十月、十一月来填充月份选择器轮。那么如果用户切换到2017年,你需要重建只有一月、二月和三月的月轮。
但是,现在您没有使用日期选择器,您使用的是 UIPickerView
您想要像日期选择器一样。
因此,除了根据当前年份重建月份微调器之外,您还必须设法设置日期选择器以显示当前所选年份和月份的有效日期。大多数月份有 30 或 31 天,但二月份呢?闰年呢?不是闰年的世纪呢?
此外,您正在构建一个看起来像日期选择器的控件,并且有点,但不完全像一个日期选择器。
您要处理公历以外的日历吗?希伯来历、阿拉伯历、中国历呢?让所有这些正常工作的负担在你身上。
Apple 在可用性研究上投入了大量资金,并提出了一个运行良好的标准控件,并确实处理了不同日历系统的本地化等问题。
简而言之,这是您不想进入的兔子洞。