隐藏 NavBar 但显示带背景的状态栏

Posted

技术标签:

【中文标题】隐藏 NavBar 但显示带背景的状态栏【英文标题】:Hide NavBar but show status bar with background 【发布时间】:2016-09-24 20:57:06 【问题描述】:

我的导航栏设置为在滚动时隐藏,但它也会在滚动时使用我的状态栏的背景颜色,在我滚动时在我的内容顶部留下白色的状态栏文本。我希望它看起来类似于许多应用程序的方式,如果我的导航栏和状态栏有橙色背景和白色文本,当滚动发生并且导航栏隐藏时,状态栏保留橙色背景。

更新1:

尝试在视图中添加一个 20 的子视图,但它没有显示出来。我可能会遗漏一些东西,因为这是我第一次尝试在没有 IB 的情况下创建应用程序。

我把这段代码放到了我的 TableViewController 中。我试过tableview。,查看。和超级视图。而且它们似乎都不起作用。

let statusBarBG = UIView()
        statusBarBG.backgroundColor = UIColor.rgb(248, green: 148, blue: 6)
        super.view?.addSubview(statusBarBG)
        super.view?.addContstraintsWithFormat("V:|[v0(20)]", views: statusBarBG)
        super.view?.addContstraintsWithFormat("H:|[v0]|", views: statusBarBG)

更新 2:

所以在尝试了一些事情之后,我的视图出现了,但它在导航栏下方并随着 tableview 滚动,这导致它在用户滚动时消失。

FeedTVController:UITableViewController

 let statusBarBG = UIView(frame: CGRect(x: 0.0, y: -44, width: UIScreen.mainScreen().bounds.width, height: 20))
            statusBarBG.backgroundColor = .redColor()  //UIColor.rgb(248, green: 148, blue: 6)
            self.view?.addSubview(statusBarBG)

应用代理:

let feedController = FeedTVController()
        let navigationController = UINavigationController(rootViewController: feedController)
        let tabBarController = TabBarController()
        tabBarController.setViewControllers([vc1, vc2, vc3], animated: true)
        window?.rootViewController = tabBarController

【问题讨论】:

你不能在视图顶部放置一个 20 点高且颜色正确的 UIView 吗? 【参考方案1】:

环顾了一整天后,我找不到适合这种情况的解决方案。以一种合乎逻辑的方式思考我想出了一个解决方案,我希望对遇到同样问题的人有所帮助。

默认情况下没有状态栏背景视图,因此我们需要创建一个并将其放置在状态栏下方但导航栏上方:

On viewDidLoad()

    self.navigationController?.hidesBarsOnSwipe = true

    /* creates a View using the navigation bar frame to place under the status bar but above the navigation bar */

    let statusBarView = UIView()
    statusBarView.backgroundColor = .blue
    statusBarView.frame = UIApplication.shared.statusBarFrame
    UIApplication.shared.keyWindow?.addSubview(statusBarView)

【讨论】:

【参考方案2】:

将您的 SuperView(ViewController 视图)的背景颜色更改为橙​​色(或您想要的任何颜色作为状态栏的默认颜色。

【讨论】:

【参考方案3】:

没有代码,因此您可以通过两种方式隐藏导航栏:

如果您要手动隐藏一个子类,以便它相对于用户向上滚动的程度(如 Facebook)隐藏:那么不要一直隐藏您的导航栏,而是将其隐藏在屏幕左下角 20 点处.

如果您使用内置动画隐藏隐藏导航栏:然后添加一个连接到容器顶部的子视图,并且具有相同的背景颜色,高 20 点,因此当导航栏消失时,子视图位于顶部。

【讨论】:

目前我正在做后者。我试图创建一个应该这样做但它不起作用的子视图。我会把它添加到我的问题中。 好的,那么您应该添加一个具有 20 点 height 的 UIView 并设置其 AutoLayout 约束,使其粘在容器的顶部。 我就是这么做的。 addConstraintsWithFormat("V:|[v0(20)]", 视图:statusBarBG) @MichaelWilliams 您需要使用"V:[topGuide]-0-[v0(20)]",这样您的视图才会停留在导航栏上,而不是位于导航栏下方的根视图的顶部。 topGuide 根据控制台是无效参数

以上是关于隐藏 NavBar 但显示带背景的状态栏的主要内容,如果未能解决你的问题,请参考以下文章

Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景

隐藏状态栏但显示操作栏

UINavigationBar 外观 setBackgroundImage 隐藏状态栏

滚动时隐藏导航栏而不隐藏状态栏及其背景

android 动态控制状态栏显示和隐藏的方法实例

修改状态栏的文字颜色和背景色