有人遇到iOS 14系统下UIDatePicker无法正常显示的问题吗?
问题根因
iOS 14 对 UIDatePicker 的默认展示样式做了破坏性变更:
- iOS 13 及更早版本的默认
datePickerStyle为.wheels滚轮样式 - iOS 14 及以上版本的默认
datePickerStyle为.automatic,系统会根据使用场景自动选择.compact/.inline新样式,这类新样式的尺寸计算、展示逻辑和旧的滚轮样式完全不同,如果直接沿用 iOS 13 的弹窗展示逻辑就会出现不显示的问题。
解决方案
方案1:强制沿用旧版滚轮样式
如果不需要用到 iOS 14 新增的日历样式,直接显式指定样式即可实现全版本兼容,原有其他展示逻辑不需要修改:
let datePicker = UIDatePicker() // 显式指定滚轮样式,兼容全系统版本 if #available(iOS 13.4, *) { datePicker.preferredDatePickerStyle = .wheels } // 其余原有 datePicker 配置、弹窗展示逻辑保持不变即可
OC 版本代码如下:
UIDatePicker *datePicker = [[UIDatePicker alloc] init]; if (@available(iOS 13.4, *)) { datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels; } // 原有后续逻辑保持不变
方案2:适配新版样式
如果要使用 iOS 14 的新日历样式,需要做对应适配:
- 调整弹窗容器的尺寸约束,适配新样式的自动布局规则
- 若使用
.compact样式,不需要自己写弹窗逻辑,系统点击后会自动弹出浮层选择器,移除原有自定义的 present 代码即可
其他排查点
- 检查弹窗容器的
translatesAutoresizingMaskIntoConstraints属性是否设置为 false,是否给 date picker 添加了足够的宽高/位置约束 - 排查是否有仅在 iOS 14 以上生效的 UI 适配代码,遮挡了 date picker 的视图层级
- 检查 date picker 的
isHidden属性、alpha 值是否被误修改为不显示状态
内容的提问来源于stack exchange,提问作者Rakesh Patel
相关产品推荐
相关产品推荐

