iOS使用UINavigationBarAppearance时设置状态栏文本颜色(barStyle失效)
解决方案
以下两种方案均满足业务需求,无需大范围修改现有代码,适合大规模项目落地:
方案1:通过扩展统一接管状态栏样式
该方案无需修改原有导航栏配置逻辑,仅需新增两个扩展即可实现全局自动适配:
- 首先给
UINavigationController添加扩展,让它优先使用当前顶层控制器的状态栏样式配置:
extension UINavigationController { open override var preferredStatusBarStyle: UIStatusBarStyle { topViewController?.preferredStatusBarStyle ?? .default } }
- 再给
UIViewController添加扩展,自动根据当前导航栏的背景色判断状态栏文本颜色,也可以根据业务需求自行指定规则:
extension UIViewController { open override var preferredStatusBarStyle: UIStatusBarStyle { guard let navBarAppearance = navigationController?.navigationBar.standardAppearance else { return .default } // 取当前导航栏生效的背景色 let bgColor = navBarAppearance.backgroundColor ?? .white // 计算颜色亮度,亮度大于0.5返回黑色文本,否则返回白色 var white: CGFloat = 0 bgColor.getWhite(&white, alpha: nil) return white > 0.5 ? .darkContent : .lightContent } }
配置完成后全局自动生效,无需每个页面单独修改代码。
方案2:兼容原有barStyle配置,侵入性极低
iOS15+使用UINavigationBarAppearance后,barStyle生效的前提是navigationBar.barTintColor不为空,你只需要在配置Appearance的同时,给barTintColor设置和Appearance背景色一致的值即可:
override func viewDidLoad() { super.viewDidLoad() let navigationBar = navigationController?.navigationBar // 使用新的Appearance API设置导航栏样式 let navBarAppearance = UINavigationBarAppearance() navBarAppearance.backgroundColor = UIColor.purple navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white] navigationBar?.standardAppearance = navBarAppearance navigationBar?.scrollEdgeAppearance = navBarAppearance // 新增这一行,barTintColor和Appearance背景色保持一致 navigationBar?.barTintColor = navBarAppearance.backgroundColor // 原有的barStyle配置即可正常生效 navigationBar?.barStyle = .black }
该方案对现有代码侵入性极低,原有barStyle的业务逻辑完全可以复用,也不会影响弹出菜单的显示模式。
内容的提问来源于stack exchange,提问作者bencallis
相关产品推荐
相关产品推荐

