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
相关产品推荐
相关产品推荐

