ios - UIDatePicker 与伊斯兰历的奇怪行为

标签 ios swift uidatepicker

注意:错误已报告给 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)

截图:

enter image description here

最佳答案

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

需要说明的是,额外的“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/

相关文章:

iphone - 根据不在设备设置上的应用程序设置,在 UIDatepicker 中以 12 和 24 小时格式显示时间

ios - 项目上有白色背景的 UIDatePicker

ios - 如何强制应用程序在从后台返回时始终从头开始?

ios - 缺少 iPad 4.0 模拟器

ios - Xcode 6 标准架构不包括 armv7s

ios - 在 UISegmentedController 中隐藏一个段

swift - 为什么在 Swift 中点击 iAd 时我的游戏不会暂停?

ios - 'Int' 与 'String.Index' 不同

ios - 我正在通过应用程序绑定(bind)工作计时器

ios - UIDatePicker 在第一次触摸时没有响应