iOS13下无法修改状态栏背景色,寻求可行实现方案
iOS13+ 修改状态栏背景色的可行方案
嗨,我刚好踩过这个坑!iOS13之后苹果彻底封掉了通过私有API获取系统状态栏实例的路径,你之前用的UIApplication.shared.value(forKey: "statusBar")属于调用私有属性,不管是Beta版还是正式版都不再支持,而且这种写法本来就有审核被拒的风险,所以得换官方允许的方式来实现。
下面给你两个最常用的可行方案:
方案一:利用导航栏延伸(推荐,适合带导航栏的页面)
iOS13之后,状态栏的视觉区域默认和导航栏是连在一起的,只要把导航栏设置为不透明,状态栏的背景就会自动继承导航栏的颜色:
override func viewDidLoad() { super.viewDidLoad() // 关键:关闭导航栏半透明 navigationController?.navigationBar.isTranslucent = false // 设置导航栏背景色,状态栏会同步这个颜色 navigationController?.navigationBar.backgroundColor = UIColor.yourCustomColor // 触发状态栏样式更新(如果需要调整文字颜色) setNeedsStatusBarAppearanceUpdate() } // 自定义状态栏文字样式(可选) override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent // 浅色文字适配深色背景;.default为深色文字 }
如果某个页面需要单独设置不同的状态栏背景色,只要在该页面的viewWillAppear里修改导航栏背景色,viewWillDisappear里恢复原来的颜色即可。
方案二:自定义状态栏背景View(适合无导航栏的页面)
如果你的页面没有导航栏,可以自己创建一个View覆盖在状态栏的位置,模拟状态栏背景:
func setupCustomStatusBarBackground(with color: UIColor) { guard let window = UIApplication.shared.windows.first else { return } let statusBarView = UIView() statusBarView.backgroundColor = color statusBarView.tag = 999 // 标记方便后续移除或修改 statusBarView.translatesAutoresizingMaskIntoConstraints = false window.addSubview(statusBarView) // 适配不同设备、分屏和旋转的约束 NSLayoutConstraint.activate([ statusBarView.topAnchor.constraint(equalTo: window.topAnchor), statusBarView.leadingAnchor.constraint(equalTo: window.leadingAnchor), statusBarView.trailingAnchor.constraint(equalTo: window.trailingAnchor), statusBarView.heightAnchor.constraint(equalToConstant: window.windowScene?.statusBarManager?.statusBarFrame.height ?? 20) ]) // 确保View在最顶层,不被其他内容遮挡 window.bringSubviewToFront(statusBarView) } // 调用示例:在AppDelegate或ViewController的viewDidLoad中执行 setupCustomStatusBarBackground(with: .orange)
额外注意事项:
- 屏幕旋转时,记得更新自定义View的高度,可以监听
UIWindowScene.didUpdateCoordinateSpaceNotification通知,或者在viewWillLayoutSubviews里重新计算高度 - 绝对不要再尝试用任何私有API获取系统状态栏,苹果现在对私有API的检测越来越严格,很容易导致审核被拒
内容的提问来源于stack exchange,提问作者Nij
相关产品推荐
相关产品推荐

