如何在AppDelegate中全局设置所有视图控制器的状态栏背景色
全局设置App状态栏背景色方案
完全可以在App全局层面配置状态栏背景色,无需在每个视图控制器中单独添加代码,具体适配不同iOS版本的实现方式如下:
实现说明
- iOS 12及更低版本:可以直接通过KVC获取状态栏全局实例修改背景色,在AppDelegate启动方法中配置一次即可全局生效
- iOS 13及更高版本:由于系统将状态栏管理权交给了UIWindowScene,我们可以在全局Window上添加一个固定在状态栏位置的自定义视图,所有页面都会共用这个视图的样式
完整实现代码
场景1:项目未使用SceneDelegate(兼容iOS12及更低版本的旧项目)
在AppDelegate.swift的application(_:didFinishLaunchingWithOptions:)方法中添加如下代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 全局状态栏配置 if #available(iOS 13.0, *) { guard let window = self.window else { return true } let statusBarHeight = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 let statusBarView = UIView(frame: CGRect(x: 0, y: 0, width: window.bounds.width, height: statusBarHeight)) statusBarView.backgroundColor = .red // 修改为你需要的颜色 statusBarView.tag = 10086 // 设置固定tag方便后续修改样式 window.addSubview(statusBarView) window.bringSubviewToFront(statusBarView) } else { let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView statusBar?.backgroundColor = .red // 修改为你需要的颜色 } // 其他原有启动逻辑 return true }
场景2:项目使用SceneDelegate(iOS13及以上的新项目)
在SceneDelegate.swift的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) self.window = window // 全局状态栏配置 let statusBarHeight = windowScene.statusBarManager?.statusBarFrame.height ?? 0 let statusBarView = UIView(frame: CGRect(x: 0, y: 0, width: window.bounds.width, height: statusBarHeight)) statusBarView.backgroundColor = .red // 修改为你需要的颜色 statusBarView.tag = 10086 // 设置固定tag方便后续修改样式 window.addSubview(statusBarView) window.bringSubviewToFront(statusBarView) // 其他原有Scene初始化逻辑,比如设置根控制器 window.rootViewController = YourRootViewController() window.makeKeyAndVisible() }
动态修改颜色的方法
如果后续需要切换状态栏颜色,直接通过tag取出全局的状态栏视图修改即可:
if #available(iOS 13.0, *) { guard let window = UIApplication.shared.windows.first else { return } if let statusBarView = window.viewWithTag(10086) { statusBarView.backgroundColor = .blue // 改成新的颜色 } } else { let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView statusBar?.backgroundColor = .blue }
内容的提问来源于stack exchange,提问作者safetotry
相关产品推荐
相关产品推荐

