注意:错误已报告给 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 并不难,但你必须小心,因为 NSCalendar
和 NSDatePicker
都有错误。
需要说明的是,额外的“2”是不可选择的,就像短月内30是不可选择的一样。 NSDatePicker 不会隐藏无效的日期或月份,但会使它们不可选择。因此,在公历中,如果您选择二月,您仍然会看到 29、30 和 31,但尝试选择它们时,选择器将变为 28。DataPicker 通过调用 maximumRangeOfUnit 计算出要显示多少个月和多少天:
在日历上。在伊斯兰日历中,正确的最大值是 {1, 30},但是 NSCalendar
为所有伊斯兰日历的 maximumRangeOfUnit:NSCalendarUnitDay
返回 {1,31}。
所以有两个错误。第一个是 NSCalendar 说伊斯兰月可以有 31 天(我不相信这是真的),第二个问题是 NSDatePicker
显示第 31 天是 2 而不是31.
制作自己的 NSDatePicker
真的不难。每个组件中的元素数量始终相同(只需确保手动将天设置为 30,而不使用 NSCalendar 中的值)。棘手的部分是确定日期是否无效并将元素显示为灰色并且不让纠察线停留在其上。您可以使用 rangeOfUnit:InUnit:forDate
获取一个月中的天数或一年中的月数。如果选择了无效元素,他们会将值向下移动到最高有效日期(即,如果用户在一个月中选择 30 天,而该月有 29 天,则选择 29)。
一旦选择了一行,您就可以使用 NSCalendar 上的 dateFromComponents
将日-月-年转换为 NSDate。
关于ios - UIDatePicker 与伊斯兰历的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40571595/