如何在iOS 13中调暗状态栏

时间:2019-09-24 07:10:16

标签: ios swift statusbar ios13 uiapplication

我一直在开发一个iOS应用程序,该应用程序在iOS 13之前可以在弹出窗口出现时使状态栏“变暗”,只需添加一个以边界为状态栏的视图并应用.5的字母:

lazy var fadeStatusBar: UIView = {
    let fadeStatusBar = UIView(frame: UIApplication.shared.statusBarView?.frame ?? UIApplication.shared.statusBarFrame)
    fadeStatusBar.backgroundColor = UIColor.black
    fadeStatusBar.alpha = 0
    fadeStatusBar.translatesAutoresizingMaskIntoConstraints = false
    return fadeStatusBar
}()

statusBarView是UIApplication的扩展:

extension UIApplication {
    var statusBarView: UIView? {
        if #available(iOS 13.0, *) {
            let tag = 38482458385
            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
    }
}

然后我可以将fadeStatusBar alpha属性设置为.5动画。但是,这在iOS 13中不再起作用。我只是想知道是否仍然有可能实现,因为我在another thread中读到,本机iOS应用程序也删除了此功能:

  

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

     

您可以在Apple Books应用程序中看到此内容,该应用程序以前使状态变暗   在iOS 12上处于黑暗模式时出现竖线,但这在iOS 13上不会发生。

我的问题与上面提到的问题有所不同,因为存在的问题是编辑状态栏本身的Alpha,而我很乐意使用覆盖视图。任何实现预期结果的建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以尝试创建另一个UIWindow实例并将其level属性设置为statusBaralert

链接有关UIWindow级别的Apple文档:https://developer.apple.com/documentation/uikit/uiwindow/level/

答案 1 :(得分:0)

您可以添加视图并使其变暗并将其作为子视图添加到状态栏,如下所示:

// Dim status bar
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
let wFrame = window?.windowScene?.statusBarManager?.statusBarFrame
let statusBarView = UIView(frame: wFrame!)
statusBarView.restorationIdentifier = "statusBarView"
statusBarView.backgroundColor = UIColor.black.withAlphaComponent(0.6)
window?.addSubview(statusBarView)

如果你想恢复它,你可以做如下:

// Revert status bar back to normal
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
for subview in window!.subviews {
    if subview.restorationIdentifier == "statusBarView" {
        subview.removeFromSuperview()
    }
}