UIDatePicker 与伊斯兰历的奇怪行为

UIDatePicker strange behaviour with Islamic calendar

注意:向 Apple 报告了错误

雷达编号:29265429 (Link)

我正在使用 UIDatePicker。当我给公历时,它工作正常。天从1开始到31

然而,当我给它伊斯兰 islamicUmmAlQura 它给了我一个奇怪的行为。天数从 1 到 30,但在 1 和 30 以下有一个“2”,因此天数如下 2,1,2,3,4 ... 30

我创建了一个新的空 iOS 项目并将以下代码放入 viewDidLoad 方法中:

let picker = UIDatePicker(frame: CGRect(x: 0, y: 30, width: 0, height: 0))

picker.datePickerMode = .date
picker.date = Date()
picker.calendar = Calendar(identifier: .islamicUmmAlQura)
picker.autoresizingMask = UIViewAutoresizing.flexibleRightMargin
picker.frame.size.width = 300
view.addSubview(picker)

截图:

自己制作一个看起来像 UIDatePicker 的 UIPicker 并不难,但是你必须要小心,因为 NSCalendarNSDatePicker 都有错误。

需要说明的是,额外的“2”是 select 不能用的,就像 30 不能在短时间内 select 一样。 NSDatePicker 不会隐藏无效的日期或月份,但会使它们无法select。所以在公历中,如果你 select 二月你仍然会看到 29、30 和 31,但是尝试 select 他们选择器将达到 28。通过在日历上调用 maximumRangeOfUnit: 来显示。在伊斯兰日历中,正确的最大值是 {1, 30},但是 NSCalendar returns {1,31} 对于所有伊斯兰日历 maximumRangeOfUnit:NSCalendarUnitDay

所以有两个错误。一是 NSCalendar 说伊斯兰月可以有 31 天(我不相信这是真的),二是 NSDatePicker 显示第 31 天是 2 而不是 31。

自己制作 NSDatePicker 真的不难。每个组件中的元素数量始终相同(只需确保手动将天设置为 30,而不使用 NSCalendar 中的值)。棘手的部分是确定日期是否无效并将元素显示为灰色并且不让纠察线停留在其上。您可以使用 rangeOfUnit:InUnit:forDate 来获取一个月中的天数或一年中的月数。如果无效元素得到 selected 他们将值向下移动到最高有效日期(即,如果用户 selects 30 在一个月中有 29 天 select 29)。

一旦一行被 select 编辑,您可以在 NSCalendar 上使用 dateFromComponents 从日-月-年转换为 NSDate。