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

iOS15下应用运行时动态修改NavigationBar颜色失效如何解决?

问题原因

你遇到的iOS15+运行时动态修改导航栏颜色不生效的核心原因是:UINavigationBar.appearance() 全局代理的配置仅对修改后新创建的导航栏实例生效,已经初始化完成、当前正在显示的导航栏不会自动同步全局代理的新配置。

修复方案

你需要在修改全局代理的同时,手动更新当前已存在的导航栏实例的配置,修正后的代码如下:

func setNavBarColour() {
    let targetColor = LangBuilds.flavColor
    if #available(iOS 15, *) {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
        appearance.backgroundColor = targetColor
        // 1. 先更新全局代理,保证后续新创建的导航栏生效
        let proxy = UINavigationBar.appearance()
        proxy.tintColor = targetColor
        proxy.standardAppearance = appearance
        proxy.scrollEdgeAppearance = appearance
        // 2. 重点:手动更新当前已存在的导航栏配置
        if let currentNav = self.navigationController {
            currentNav.navigationBar.tintColor = targetColor
            currentNav.navigationBar.standardAppearance = appearance
            currentNav.navigationBar.scrollEdgeAppearance = appearance
            // 强制刷新导航栏显示
            currentNav.navigationBar.setNeedsLayout()
            currentNav.navigationBar.layoutIfNeeded()
        }
    } else {
        self.navigationController?.navigationBar.barTintColor = targetColor
    }
    self.searchController.searchBar.searchTextField.textColor = .black
    self.searchController.searchBar.searchTextField.backgroundColor = .white
    self.searchController.searchBar.searchTextField.autocapitalizationType = .none
    changeTextHolder()
}
补充注意事项
  • 如果你的应用存在多个导航控制器实例(比如TabBarController每个tab对应独立的导航控制器),需要遍历所有已创建的导航控制器,统一更新每个导航栏的appearance配置
  • 如果你有模态弹出的导航控制器,也需要同步更新对应实例的配置,避免切换主题后部分页面导航栏颜色不一致

内容的提问来源于stack exchange,提问作者Jyotirmay Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:45:03