iOS 15下使用日本历法的UIDatePicker不显示纪元(年号)问题咨询
问题原因
这是iOS 15及以上版本的系统层面行为变更,不属于代码逻辑问题:苹果在iOS15中调整了UIDatePicker的日期格式化规则,当给UIDatePicker设置的calendar与当前Locale的默认历法不一致时,系统会自动省略年份前的纪元标识,只保留纯数字年份,导致日本历法仅显示30、2这类数字。
修复方案
方案1:定制匹配历法的Locale(改动最小,推荐)
你只需要在设置UIDatePicker的locale时,针对日本历法做特殊处理,构造绑定了日本历法标识的Locale对象即可,修改你reloadPickers()方法中设置locale的代码:
func reloadPickers() -> Void { var title = timeZone?.localizedName(for: .standard, locale: locale) if (timeZone?.isDaylightSavingTime(for: dateTimeComplete!))! { title = timeZone?.localizedName(for: .daylightSaving, locale: locale) } buttonTimeZone.setTitle(title, for: .normal) let originalDateSecondsOnly = NSCalendar.current.dateComponents([.second], from: dateTimeComplete!) secondPickerView.reloadAllComponents() if arraySeconds?.count != 0 { secondPickerView.selectRow(second, inComponent: 0, animated: false) } let components = calendar.dateComponents([.era, .year, .month, .day, .hour, .minute], from: dateTimeComplete!) let dateWithoutSecond = calendar.date(from: components) datePicker.date = dateWithoutSecond! datePicker.timeZone = timeZone! datePicker.calendar = calendar // 新增iOS15+日本历法适配逻辑 if calendar.identifier == .japanese, #available(iOS 15, *) { let adjustedLocaleId = "\(locale.identifier)@calendar=japanese" datePicker.locale = Locale(identifier: adjustedLocaleId) } else { datePicker.locale = locale } datePicker.addTarget(self, action: #selector(DateChooserViewController.dateUpdated), for: .valueChanged) timePicker.date = dateWithoutSecond! timePicker.timeZone = timeZone! timePicker.calendar = calendar // timePicker做同样的适配 if calendar.identifier == .japanese, #available(iOS 15, *) { let adjustedLocaleId = "\(locale.identifier)@calendar=japanese" timePicker.locale = Locale(identifier: adjustedLocaleId) } else { timePicker.locale = locale } timePicker.addTarget(self, action: #selector(DateChooserViewController.timeUpdated), for: .valueChanged) }
方案2:自定义UIPickerView实现日期选择
如果你的App需要支持更多历法的自定义显示效果,不想受系统UIDatePicker的行为约束,可以完全自己用UIPickerView实现日期选择器,自己格式化每个选项的显示文本,彻底掌控渲染逻辑,不会受系统版本迭代的影响。
内容的提问来源于stack exchange,提问作者tsuyoski
相关产品推荐
相关产品推荐

