【问题标题】:Add black overlay to entire screen including status bar将黑色覆盖添加到整个屏幕,包括状态栏
【发布时间】:2018-11-28 14:47:47
【问题描述】:

我有一个带有UINavigationControllerUITabBarController 的应用程序。 UITabBarController 内部是一个按钮,它应该呈现一个模态视图,我想用褪色背景(黑色,0.5 alpha)将整个屏幕变黑。

我使用UIView() 执行此操作,如下所示,这是在UITabBarController 类中设置的:

let fadeBackground: UIView = {
    let fadeBackground = UIView(frame: self.view.frame)
    fadeBackground.backgroundColor = UIColor.black
    fadeBackground.alpha = 0.5
    return fadeBackground
}()

然后我使用view.addSubview(fadeBackground) 将其添加到我的视图中。但是,这会在包括UINavigationControllerUITabBarController 在内的所有内容之上返回褪色背景,但它不会覆盖状态栏。为了显示:

我现在想知道如何将我创建的UIView() 添加到顶部位置,这样它也可以越过状态栏。我知道这可能很棘手,但我见过状态栏上有一个黑条的应用程序,所以我认为这是我需要的,然后将 alpha 设置为 .5。

到目前为止我尝试了什么:

  • fadeBackground.window?.windowLevel = UIWindow.Level.statusBar + 1
  • fadeBackground.layer.zPosition = 1

但似乎两者都不起作用。我还尝试使用UIApplication.shared.keyWindow?.addSubview(fadeBackground)UIView() 添加到keyWindow,但也没有成功。有什么想法或建议吗?

【问题讨论】:

    标签: ios swift uinavigationcontroller uitabbarcontroller uistatusbar


    【解决方案1】:

    您可以在 StatusBarView 中添加另一个子视图,以使里面的文本也褪色。

    extension UIApplication {
        var statusBarView: UIView? {
            return value(forKey: "statusBar") as? UIView
        }
    }
    

    然后在 ViewController 中:

    class CustomTabBarController: UITabBarController {
        lazy var fadeStatusBarBackground: UIView = {
            let fadeBackground = UIView(frame: UIApplication.shared.statusBarView?.frame ?? .zero)
            fadeBackground.backgroundColor = UIColor.black
            fadeBackground.alpha = 0.5
            return fadeBackground
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            UIApplication.shared.statusBarView?.addSubview(fadeStatusBarBackground)
        }
    }
    

    【讨论】:

    • 这不起作用...我在我的 UITabBarController 类中工作,它设置 UINavigationController 如下:let HomeController = UINavigationController(rootViewController: HomeViewController()) 所以我无法按照你的建议访问它
    • 据我所知,您有带有 HomeController 的 UITabBarController。此时你想展示一些自定义 ViewController,它的背景会在全屏之上褪色?
    • 没错。但是我不希望 ViewController 有一个褪色的背景,我想添加一个带有褪色背景的UIView。然后,在此之上,我将展示一个不会褪色但背景会褪色的 ViewController。然而这不是此刻的问题,问题是状态栏没有像我想要的那样消失。
    • 我实际上有点困惑,因为您的代码对我有用。如果我想在 UITabBarController 中添加 fadeBackground 作为主视图的子视图,它将覆盖包括状态栏在内的所有内容
    • 但是它是否也将带有 0.5 alpha 的黑色添加到状态栏的文本中?那么状态栏中电池指示灯的绿色是否也会随着黑色的 0.5 褪色?
    【解决方案2】:

    试试这个,它会在整个屏幕上添加一个视图,包括状态栏,

    if let appDelegate = UIApplication.shared.delegate as? AppDelegate, let window = appDelegate.window {
            let windowFrame = window.frame
            let overlayView = UIView(frame: windowFrame)
            imageView.backgroundColor = UIColor.black.withAlphaComponent(0.7)
            window.addSubview(overlayView)
        }
    

    【讨论】:

    • 试过了,但它没有添加视图,例如我看不到它。我尝试在闭包内打印一些东西,这很有效 - 所以 if let 语句不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2012-03-23
    • 2021-05-09
    相关资源
    最近更新 更多