如何在Cordova开发中修改iOS端UIPickerView的背景颜色
解决方案
完全可以通过原生Swift/Objective-C代码实现UIPickerView背景色修改,不需要改动现有前端HTML代码,具体实现逻辑如下:
实现原理
Cordova WebView中<select>标签触发弹出的选择器本质是系统原生的UIPickerView组件,你可以通过监听系统键盘弹出通知,遍历当前应用视图层级找到对应UIPickerView实例,直接修改其背景属性即可。
Objective-C 实现代码
- 在
AppDelegate.m或者自定义Cordova插件的初始化方法中添加通知监听:
// 监听键盘弹出事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
- 实现通知回调与视图查找逻辑:
- (void)keyboardWillShow:(NSNotification *)notification { // 遍历所有应用窗口查找视图 for (UIWindow *window in [UIApplication sharedApplication].windows) { for (UIView *subView in window.subviews) { [self searchPickerViewInView:subView]; } } } - (void)searchPickerViewInView:(UIView *)currentView { // 找到UIPickerView后修改背景色 if ([currentView isKindOfClass:[UIPickerView class]]) { currentView.backgroundColor = [UIColor greenColor]; // 可选:修改选中行的指示器颜色 if ([currentView respondsToSelector:@selector(setSelectionIndicatorColor:)]) { [currentView performSelector:@selector(setSelectionIndicatorColor:) withObject:[UIColor darkGrayColor]]; } return; } // 递归遍历子视图 for (UIView *sub in currentView.subviews) { [self searchPickerViewInView:sub]; } }
Swift 实现代码
- 添加通知监听:
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardShow), name: UIResponder.keyboardWillShowNotification, object: nil)
- 实现回调逻辑:
@objc private func handleKeyboardShow() { UIApplication.shared.windows.forEach { window in findAndModifyPicker(in: window) } } private func findAndModifyPicker(in view: UIView) { if let pickerView = view as? UIPickerView { pickerView.backgroundColor = .green // 可选:修改选中行指示器颜色 pickerView.selectionIndicatorColor = .darkGray return } view.subviews.forEach { findAndModifyPicker(in: $0) } }
注意事项
- 如果你应用内其他原生页面也使用了UIPickerView且不需要修改背景色,可以增加判断逻辑,仅当前顶层页面是Cordova WebView页面时再执行修改操作
- 上述代码兼容iOS 10及以上所有系统版本,包含iOS 14+调整后的UIPickerView新样式
内容的提问来源于stack exchange,提问作者Rohit Singh
相关产品推荐
相关产品推荐

