如何在 iOS 13 中更改状态栏 Alpha?

Posted

技术标签:

【中文标题】如何在 iOS 13 中更改状态栏 Alpha?【英文标题】:How can I change Status Bar Alpha in iOS 13? 【发布时间】:2019-11-26 18:05:12 【问题描述】:

我想在 ios 13 中更改状态栏 Alpha。

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

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

【问题讨论】:

据我所知,你不能这样做。状态栏可以是黑色或白色。您正在尝试访问一个私有 API,如果您提交到 App Store,我认为 Apple 不会允许该 API。 【参考方案1】:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'应用程序调用 -statusBar 或 UIApplication 上的 -statusBarWindow:此代码必须更改,因为不再有状态栏或状态栏窗口。使用 窗口场景中的 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
    

这些提到的解决方案对我有用。

【讨论】:

您只是在 iOS 13 的情况下添加空 UIView,这将如何与 StatusBar 特定属性一起使用,例如。 “前景颜色”? 这里我只提供了崩溃的解决方案,我想我们会改变颜色,它是statusBarUIView var的alpha。 @AksharDarji keyWindow 在 iOS 13 中已弃用。 @ParthAdroja 是的。但是,我们已经在 beta 中进行了测试,当时它运行良好。无论如何,如果你想使用它,你可以查看***.com/a/57169802/2677134 或者你可以在这里贡献同样的内容。 您只是在 iOS 13 的情况下添加空 UIView【参考方案2】:

状态栏是由 iOS 13 上的系统进程(在应用程序进程之外)呈现的,因此应用程序无法更改它。 (来源:在 WWDC 2019 实验室与 UIKit 工程师交谈。)

您可以在 Apple Books 应用中看到这一点,该应用曾在 iOS 12 上将状态栏调暗为暗模式,但在 iOS 13 上不会发生这种情况。

【讨论】:

【参考方案3】:

我有一个自定义解决方案,用于在 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

Gist

另外,查看文章iOS 13 How to Change StatusBar Color?

最后一件事,你仍然可以改变状态栏样式:

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

【讨论】:

以上是关于如何在 iOS 13 中更改状态栏 Alpha?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 13 中更改状态栏颜色? [复制]

在 iOS 13 中停止更改状态栏

在 iOS13 上更改状态栏颜色

iOS 13 设置状态栏背景颜色

iOS 7隐藏导航栏时如何更改状态栏的颜色?

Flutter-如何在深色模式下更改状态栏文字颜色?