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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:15:47