如何在iOS受限访问的PHPickerViewController中设置导航按钮为黑色?
如何在iOS受限访问的PHPickerViewController中设置导航按钮为黑色?
我太懂你这种头疼的感觉了——受限照片库访问模式下,PHPicker的「取消」「完成」按钮白字配白背景,完全看不见,试了全局导航栏设置和直接修改picker都没效果对吧?别着急,这个问题的核心是受限模式下的PHPicker用了特殊的系统导航栏样式,常规配置没覆盖到,咱们来一步步解决它。
核心解决方案:补上紧凑样式的导航栏配置
受限访问界面的导航栏采用的是「紧凑样式(compactAppearance)」,你之前只配置了standard和scrollEdgeAppearance,漏掉了这个关键的样式设置,补上后就能覆盖到受限模式的界面了:
// 可以放在AppDelegate或SceneDelegate的初始化代码中 let navAppearance = UINavigationBarAppearance() navAppearance.configureWithOpaqueBackground() navAppearance.backgroundColor = .white // 设置标题文字颜色 navAppearance.titleTextAttributes = [.foregroundColor: UIColor.black] // 设置导航按钮的文字颜色 navAppearance.buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.black] // 统一设置导航栏元素的色调(包括按钮图标和文字) navAppearance.tintColor = .black // 去掉导航栏下方的阴影线 navAppearance.shadowColor = .clear // 给所有导航栏样式都应用这个配置 UINavigationBar.appearance().standardAppearance = navAppearance UINavigationBar.appearance().scrollEdgeAppearance = navAppearance UINavigationBar.appearance().compactAppearance = navAppearance // 关键:必须加上这个! UINavigationBar.appearance().compactScrollEdgeAppearance = navAppearance
可选方案:只针对PHPickerViewController配置
如果你不想全局修改所有导航栏的样式,也可以专门针对PHPickerViewController做针对性配置,这样不会影响APP里的其他页面:
if #available(iOS 14.0, *) { let pickerNavAppearance = UINavigationBarAppearance() pickerNavAppearance.configureWithOpaqueBackground() pickerNavAppearance.backgroundColor = .white pickerNavAppearance.titleTextAttributes = [.foregroundColor: UIColor.black] pickerNavAppearance.buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.black] pickerNavAppearance.tintColor = .black pickerNavAppearance.shadowColor = .clear // 只让PHPicker的导航栏应用这个样式 UINavigationBar.appearance(whenContainedInInstancesOf: [PHPickerViewController.self]).standardAppearance = pickerNavAppearance UINavigationBar.appearance(whenContainedInInstancesOf: [PHPickerViewController.self]).compactAppearance = pickerNavAppearance UINavigationBar.appearance(whenContainedInInstancesOf: [PHPickerViewController.self]).scrollEdgeAppearance = pickerNavAppearance }
为什么之前的方法没生效?
受限访问模式下的PHPicker界面是系统特殊托管的,它默认使用紧凑导航栏样式,而你之前的配置只覆盖了标准和滚动边缘样式,所以设置没起作用。另外,直接修改picker.navigationController?.navigationBar的时机太晚了——PHPicker的导航栏在展示前就已经由系统初始化完成,提前用UIAppearance做全局/针对性配置才是有效的方式。
备注:内容来源于stack exchange,提问作者hedi gharbi
相关产品推荐
相关产品推荐

