如何在iOS 13中更改状态栏透明度?

5

我想在iOS 13中更改状态栏透明度。

let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
statusBarWindow?.alpha = 0.5

当我尝试这样做时,应用程序崩溃了(线程1:信号SIGABRT)。

1
据我所知,您无法这样做。状态栏只能是黑色或白色。如果您要提交到应用商店,您正在尝试访问私有API,我认为苹果不会允许。 - Chris
3个回答

8
由于应用程序调用了UIApplication的-statusBar或-statusBarWindow方法,而现在已经没有状态栏或状态栏窗口,因此出现了NSInternalInconsistencyException异常。需要更改代码以使用窗口场景上的statusBarManager对象来解决问题。
您可以参考以下答案来解决崩溃问题。
var statusBarUIView: UIView? {
        if #available(iOS 13.0, *) {
            let tag = 38482458
            if let statusBar = self.keyWindow?.viewWithTag(tag) {
                return statusBar
            } else {
                let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
                statusBarView.tag = tag

                self.keyWindow?.addSubview(statusBarView)
                return statusBarView
            }
        } else {
            if responds(to: Selector(("statusBar"))) {
                return value(forKey: "statusBar") as? UIView
            }
        }
        return nil
    }

这些解决方案对我有用。

1
在iOS 13的情况下,您只是添加了一个空的UIView,那么这将如何处理像“foregroundColor”这样的StatusBar特定属性? - ViruMax
1
这里我只提供了崩溃的解决方案,我猜我们将从statusBarUIView变量更改颜色和透明度。 - Akshar Darji
@AksharDarji keyWindow 在 iOS 13 中已被弃用。 - Parth Adroja
@ParthAdroja 是的。但是我们在测试版中进行了测试,当时它运行良好。无论如何,如果您想使用它,可以在 https://dev59.com/7FMI5IYBdhLWcg3wFXOg#57169802 上进行检查,或者您可以在此处为其做出贡献。 - Akshar Darji
在 iOS 13 的情况下,您只是添加了一个空的 UIView。 - Habib Ali

7

iOS 13 系统进程渲染状态栏,应用程序无法更改。 (来源:在 WWDC 2019 实验室中与 UIKit 工程师交谈。)

您可以在 Apple Books 应用程序中看到这一点,在 iOS 12 的深色模式下,该应用程序曾经会使状态栏变暗,但在 iOS 13 上不再出现。


1
我有一种自定义方案可以在iOS 13及以下更改状态栏。以下是如何操作的步骤:
if #available(iOS 13.0, *) {
   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView()
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

   statusbarView.translatesAutoresizingMaskIntoConstraints = false
   statusbarView.heightAnchor
     .constraint(equalToConstant: statusBarHeight).isActive = true
   statusbarView.widthAnchor
     .constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
   statusbarView.topAnchor
     .constraint(equalTo: view.topAnchor).isActive = true
   statusbarView.centerXAnchor
     .constraint(equalTo: view.centerXAnchor).isActive = true

} else {
      let statusBar = UIApplication.shared.value(forKeyPath: 
   "statusBarWindow.statusBar") as? UIView
      statusBar?.backgroundColor = UIColor.red
}

代码片段

另外,请查看文章iOS 13如何更改状态栏颜色?

最后,您仍然可以使用以下内容更改状态栏样式:

 override var preferredStatusBarStyle : UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
    //return UIStatusBarStyle.default   // Make dark again
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接