Swift UIKit中导航栏安全区域颜色修改问题
解决导航栏(含安全区域)颜色不生效的问题
核心原因
iOS 13+ 后导航栏样式管理逻辑更新,仅设置backgroundColor或barTintColor无法覆盖安全区域,需通过UINavigationBarAppearance统一配置,尤其在Scene Delegate初始化导航控制器的场景下。
有效解决方案
1. 全局配置(推荐)
在Scene Delegate的scene(_:willConnectTo:options:)方法中初始化导航控制器时统一设置:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) let rootVC = YourRootViewController() let navVC = UINavigationController(rootViewController: rootVC) // 基础配置 navVC.navigationBar.isTranslucent = false navVC.navigationBar.tintColor = .white // 导航栏按钮、返回箭头等元素颜色 // iOS13+ 样式配置(覆盖安全区域) if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.backgroundColor = .green navVC.navigationBar.standardAppearance = appearance navVC.navigationBar.scrollEdgeAppearance = appearance // 页面滚动到顶部时的样式 } else { navVC.navigationBar.barTintColor = .green } window.rootViewController = navVC self.window = window window.makeKeyAndVisible() }
2. 单个视图控制器内配置
若仅需在特定页面生效,在对应视图控制器的viewDidLoad中添加:
override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.isTranslucent = false if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.backgroundColor = .green navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance } else { navigationController?.navigationBar.barTintColor = .green } navigationItem.titleView = searchBar }
关键注意点
scrollEdgeAppearance是iOS13+新增属性,必须与standardAppearance同时设置,才能确保安全区域颜色同步。- 避免同时混用
backgroundColor和barTintColor,iOS13+优先使用UINavigationBarAppearance管理样式。 - 检查是否存在全局样式配置(如AppDelegate或全局Appearance设置)覆盖当前页面的导航栏属性。
内容的提问来源于stack exchange,提问作者JasonDevelops
相关产品推荐
相关产品推荐

