【问题标题】:How to dim status bar in iOS 13如何在 iOS 13 中调暗状态栏
【发布时间】:2019-09-24 07:10:16
【问题描述】:

我一直在开发一个 iOS 应用程序,在 iOS 13 之前,它能够在出现弹出窗口时“变暗”状态栏。这只需添加一个带有边界的视图作为状态栏并应用0.5 alpha:

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 属性设置为0.5。但是,这在 iOS 13 中不再起作用。我只是想知道它是否仍然可以完成,因为我在 another thread 中读到原生 iOS 应用程序也删除了此功能:

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

您可以在 Apple Books 应用中看到这一点,该应用用于使状态变暗 栏在 iOS 12 上处于黑暗模式,但在 iOS 13 上不会发生。

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

【问题讨论】:

    标签: ios swift statusbar ios13 uiapplication


    【解决方案1】:

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

    // 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()
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        相关资源
        最近更新 更多