SwiftUI 如何禁用DatePicker弹出键盘及iPad键盘适配问题
禁止DatePicker弹出键盘方案
你当前使用的GraphicalDatePickerStyle在选择时间时默认支持点击唤出键盘输入,要仅保留滚动选择能力可以使用两种方案:
- 方案1:替换选择器样式(更稳定,无兼容问题)
直接将.datePickerStyle(GraphicalDatePickerStyle())替换为.datePickerStyle(WheelDatePickerStyle()),Wheel样式默认仅支持滚动选择,完全不会弹出键盘,同时保持行内展示效果,符合需求。修改后代码如下:
HStack { ... // some text if reminderToggle { DatePicker("", selection: $timestampHour, in: closedRangeTime, displayedComponents: [.hourAndMinute]) .datePickerStyle(WheelDatePickerStyle()) .accentColor(Color("ColorYellow")) .labelsHidden() } else { EmptyView() } }
- 方案2:保留Graphical样式,强制拦截键盘弹出
如果必须保留Graphical样式的UI效果,可以监听键盘弹出通知,在键盘将要弹出时立刻收起,代码如下:
DatePicker("", selection: $timestampHour, in: closedRangeTime, displayedComponents: [.hourAndMinute]) .datePickerStyle(GraphicalDatePickerStyle()) .accentColor(Color("ColorYellow")) .labelsHidden() .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { _ in UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) }
该方案仅作用在当前DatePicker展示的生命周期内,不会影响其他页面的输入功能。
iPad端全局点击收键盘失效修复
原有全局收键盘方案会拦截所有点击事件,包括iPad悬浮数字小键盘的点击事件,所以点击数字时会先触发收键盘逻辑,导致输入失效。修复方式是修改全局手势的触发规则,不拦截系统键盘的交互事件,将原有全局收键盘扩展替换为如下实现即可:
extension View { func hideKeyboardWhenTappedAround() -> some View { self.gesture( TapGesture() .onEnded { _ in UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) }, // 仅触发手势本身逻辑,不拦截子视图、系统视图的点击事件 including: .gesture ) } }
内容的提问来源于stack exchange,提问作者Yu23333
相关产品推荐
相关产品推荐

