mal*_*yeb 27 uidatepicker ios swift
注意:Bug报告给Apple
雷达编号:29265429(链接)
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
截图:
制作你自己的看起来像 UIDatePicker 的 UIPicker 并不难,但是你必须小心,因为 bug 也存在NSCalendar
于NSDatePicker
.
需要明确的是,额外的“2”是不可选择的,就像 30 在短短一个月内不可选择一样。NSDatePicker 不会隐藏无效的日期或月份,但使它们不可选择。因此,在公历中,如果您选择二月,您仍然会看到 29、30 和 31,但尝试选择它们时,选择器将变为 28。DataPicker 通过调用日历来计算要显示的月份和天数maximumRangeOfUnit:
。在伊斯兰历中,正确的最大值为 {1, 30},但对于所有伊斯兰历,NSCalendar
返回 {1,31} 。maximumRangeOfUnit:NSCalendarUnitDay
所以有两个bug。一是 NSCalendar 说伊斯兰月可以有 31 天(我不相信这是真的),第二个问题是NSDatePicker
第 31 天显示为 2 而不是 31。
自己制作NSDatePicker
其实并不难。每个组件中的元素数量始终相同(只需确保手动设置天数为 30,而不是使用 NSCalendar 中的值)。棘手的部分是确定日期是否无效并将该元素显示为灰色并且不让纠察队停留在其上。您可以用来rangeOfUnit:InUnit:forDate
获取一个月中的天数或一年中的月数。如果选择了无效元素,它们会将值向下移动到最高有效日期(即,如果用户在有 29 天的月份中选择 30,则选择 29)。
选择一行后,您可以使用dateFromComponents
NSCalendar 将日-月-年转换为 NSDate。
归档时间: |
|
查看次数: |
987 次 |
最近记录: |