iPad iOS14.7.1下WKWebView唤起UIImagePicker的DONE按钮隐藏问题
问题根因
这是iOS 14.0~14.8版本的系统固有Bug,当应用全局设置了UINavigationBar的titleTextAttributes、自定义backgroundImage或者设置了固定非继承的tintColor时,WKWebView触发系统私有调用弹出的UIImagePickerController导航栏右侧按钮会出现渲染失效问题,仅保留点击响应区域,无视觉内容。你之前全局修改tint色仅作用于返回箭头,是因为DONE按钮属于系统私有控件的自定义渲染层,没有继承全局tint配置。
解决方案
你无需手动干预UIImagePicker的唤起逻辑,只要调整全局导航栏外观的配置规则即可修复:
- 方案1:将全局导航栏样式配置限定到自定义导航控制器子类,不影响系统原生控制器
优先推荐该方案,不会侵入系统原生控件的正常展示逻辑,示例代码如下:// Objective-C 示例 if (@available(iOS 13.0, *)) { UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init]; // 替换为你的业务自定义配置 appearance.backgroundColor = [UIColor whiteColor]; appearance.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor blackColor]}; // 仅对自定义的导航控制器子类生效 [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[YourCustomNavController.class]].standardAppearance = appearance; [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[YourCustomNavController.class]].scrollEdgeAppearance = appearance; }// Swift 示例 if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() // 替换为你的业务自定义配置 appearance.backgroundColor = .white appearance.titleTextAttributes = [.foregroundColor: UIColor.black] // 仅对自定义的导航控制器子类生效 UINavigationBar.appearance(whenContainedInInstancesOf: [YourCustomNavController.self]).standardAppearance = appearance UINavigationBar.appearance(whenContainedInInstancesOf: [YourCustomNavController.self]).scrollEdgeAppearance = appearance } - 方案2:如果必须保留全局导航栏配置,可添加临时适配钩子
监听UIViewControllerDidShowNotification通知,判断当前展示的控制器是否为UIImagePickerController,如果是且运行在iOS 14.x版本,主动重置其导航栏tintColor为系统默认蓝色,控制器消失时再恢复全局配置即可。
验证逻辑
修改配置后在iPad iOS 14.7.1设备上测试WKWebView图片上传场景,确认DONE按钮可正常显示,同时业务自定义页面的导航栏样式不受影响。
内容的提问来源于stack exchange,提问作者Abdulrahman Alhashmi
相关产品推荐
相关产品推荐

