You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS使用UINavigationBarAppearance时设置状态栏文本颜色(barStyle失效)

解决方案

以下两种方案均满足业务需求,无需大范围修改现有代码,适合大规模项目落地:

方案1:通过扩展统一接管状态栏样式

该方案无需修改原有导航栏配置逻辑,仅需新增两个扩展即可实现全局自动适配:

  1. 首先给UINavigationController添加扩展,让它优先使用当前顶层控制器的状态栏样式配置:
extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        topViewController?.preferredStatusBarStyle ?? .default
    }
}
  1. 再给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:39:02