iOS自定义状态栏背景颜色不显示

Posted

技术标签:

【中文标题】iOS自定义状态栏背景颜色不显示【英文标题】:iOS Custom Status Bar Background Color not displaying 【发布时间】:2015-08-01 04:50:50 【问题描述】:

我正在尝试使用以下方法将状态栏背景颜色填充为橙色

UINavigationBar.appearance().tintColor = UIColor.orangeColor()
UINavigationBar.appearance().barTintColor = UIColor.orangeColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

但是,我得到一个白色的状态栏,应该用橙色填充而不是按照这个例子:Customize navigation bar appearance with swift

我在 didFinishLaunchingWithOptions 方法下的 AppDelegate.swift 文件中进行设置,以将其应用于整个应用程序。

我已将我的 info.plist 编辑为以下内容:View controller-based status bar appearance => NO

有谁知道我做错了什么?

编辑:我不确定这是否重要,但视图位于 UITabBarController

编辑 2:这实际上发生在所有视图中,而不仅仅是 UITabBarController

编辑 3:谢谢 @Utsav Parikh

我现在在状态栏顶部添加一个视图,当应用程序加载状态栏时它会短暂显示橙色,但是一旦完成加载,它就会被推离视图并替换为通用的白色状态栏. 为什么会发生这种情况?

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
view.backgroundColor=UIColor.orangeColor()
self.window!.rootViewController!.view.addSubview(view) 

编辑 Swift 3

UITabBarController

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

没有嵌入式控制器

我意识到有些人来这里不仅是为了状态栏,实际上是为了导航栏,所以我在此过程中学到了一些技巧,无需任何嵌入式控制器:

在您的 AppDelegate.swift 中添加此方法并在 didFinishLaunchingWithOptions

中调用它
func customizeAppearance() 
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UITabBar.appearance().barTintColor = UIColor.black
    let tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

    UITabBar.appearance().tintColor = tintColor

【问题讨论】:

访问此链接...它可能会有所帮助 [这里][1] [1]:***.com/questions/26956728/… @AshokLondhe 在问这个问题之前我已经使用了该链接,但也没有运气。 在General -> Target -> Status Bar Style下更改状态栏样式。看看有没有效果。还可以尝试在应用委托通过调度启动后更改外观,然后等待 2 秒 @TheCodingArt 我刚刚试过了,效果是一样的。我能够获得状态栏样式的 LightContent,但没有获得应该填充在其顶部的橙色背景 出于好奇,我看到您没有添加自动布局约束。您能否添加约束并确保您将其添加到顶部布局指南的顶部?或者将视图的原点在 Y 轴上提高到 -20。 【参考方案1】:

编辑 Swift 3

使用 UITabBarController

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

没有嵌入式控制器

我意识到有些人来这里不仅是为了状态栏,实际上是为了导航栏,所以我在此过程中学到了一些技巧,无需任何嵌入式控制器:

在您的 AppDelegate.swift 中添加此方法并在 didFinishLaunchingWithOptions

中调用它
func customizeAppearance() 
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UITabBar.appearance().barTintColor = UIColor.black
    let tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

    UITabBar.appearance().tintColor = tintColor

感谢 @Utsav 我将以下子视图添加到了我的 UITabBarController 中,现在这似乎可以工作了:

    let view = UIView(frame:
                    CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0)
                )
    view.backgroundColor = UIColor.orangeColor()

    self.view.addSubview(view)

UITabBarController 似乎在 AppDelegate 中表现不佳。如果有人有更好的方法,请告诉我,但是,到目前为止,这是我已经想到的解决方案。

【讨论】:

如果我像directed一样添加这个代码,我会收到错误Cannot call value of non-function type 'UIScreen',我使用的是swift 3和xcode 8。有什么建议吗?我已经开始悬赏这个问题,所以如果你能解决这个问题,你将获得 50 Rep。 @EmmetArries 我已经更新了没有 UITabBarController 的原始帖子 好的。我对 Xcode 还很陌生,对 Swift 的经验就更少了。我尝试了您指定的第二个选项的代码,但没有任何改变。这就是我需要的:我有一个单一视图应用程序,它只有一个 UIWebView 占据整个屏幕。我只需要一些可以改变状态栏背景和文本颜色的东西。 (理想情况下,文本为白色,背景为 0.5% 的不透明度或透明度)这可能吗?如果您需要更多详细信息,请告诉我! @EmmetArries 尝试将UIApplication.shared.statusBarStyle = .lightContent 添加到customizeAppearance() 方法中。在不知道上下文的情况下,您的整个 UIWebView 似乎覆盖了整个屏幕,这将导致无法更改状态栏背景。您需要将网络视图向下移动 20pt,因为这是状态栏的高度 @Simon 啊哈!你在什么地方!你的代码没有成功,但我得到了我想要的背景颜色。谢谢!【参考方案2】:

在AppDelegate的didFinishLaunchingWithOptions中添加这段代码

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
view.backgroundColor=UIColor.orangeColor()
self.window.rootViewController.view.addSubview(view)

希望对你有帮助....!!!

【讨论】:

“UIScreen 没有名为 bounds 的成员”是我在尝试此答案时遇到的错误@Utsav @Simon 尝试使用 UIScreen.mainScreen().bounds.size.width 而不是 UIScreen.mainScreen.bounds.size.width 我刚试过这个,它在加载时添加了橙色状态栏,但是一旦加载完成,它就会被推出视图并替换为白色?跨度> 【参考方案3】:

这就是我在没有使用 NavBarController 在 VC 中添加视图的情况下做到这一点的方法

我希望状态栏的颜色与 VC 视图颜色相同,所以我只写了:

override func viewDidLoad() 
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.grayColor()
    self.navigationController?.navigationBar.clipsToBounds = true

试试看。

【讨论】:

【参考方案4】:

我认为您的最后一行正在还原您的更改,试试这个:

override func viewWillAppear(animated: Bool) 
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
        super.viewWillAppear(animated)
        var nav = self.navigationController?.navigationBar
        nav?.barStyle = UIBarStyle.Black
        nav?.tintColor = UIColor.orangeColor()
        nav?.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
    

【讨论】:

不幸的是,这会产生相同的结果。感谢您的帮助【参考方案5】:

在您在info.plist 中执行以下操作之后:View controller-based status bar appearance => 否。

didFinishLaunchingWithOptions下的AppDelegate.swift文件中添加这段代码:

var navigationBarAppearace = UINavigationBar.appearance()

navigationBarAppearace.tintColor = uicolorFromHex(0xffffff)
navigationBarAppearace.barTintColor = uicolorFromHex(0x2E9AFE)

// change navigation item title color
navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

你可以选择任何十六进制代码来选择颜色..!!享受..!!

抱歉,忘记使用十六进制代码,您也将需要此代码,因此请将此代码添加到您的 AppDelegate.swift 中的任何位置:

func uicolorFromHex(rgbValue:UInt32)->UIColor 

    let red = CGFloat((rgbValue & 0xFF0000) >> 16)/256.0

    let green = CGFloat((rgbValue & 0xFF00) >> 8)/256.0

    let blue = CGFloat(rgbValue & 0xFF)/256.0

    return UIColor(red:red, green:green, blue:blue, alpha:1.0)

【讨论】:

感谢分享,但这并不能解决我当前的问题。它实际上看起来和我的很相似。 嘿,你找到解决方案了吗?【参考方案6】:

Simon 在 swift 3 中的回答

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

我知道还有另一种使用私有 api 的方式。当方向改变和键盘出现并且视图向上移动时,这有一些好处。我用过,每次都很幸运(应用已在应用商店发布)。

func setStatusBarBackgroundColor(color: UIColor) 

    guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else  return 

    statusBar.backgroundColor = color
 

【讨论】:

“私有 api”是什么意思?我将如何设置第二个选项的颜色?你说的“幸运”是什么意思?应用商店通常不接受这种做事方式吗?抱歉,我有很多问题,但我是 swift 新手。 顺便说一句,我没有 UITabBarController,所以第一个答案对我不起作用。【参考方案7】:

斯威夫特 3:

在您的 AppDelegate.swift 文件中,将下面的代码粘贴到您的 didFinishLaunchingWithOptions 方法中:

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = UIColor(red: 255/255, green: 130/255, blue: 0/255, alpha: 1.0) // Organge colour in RGB
self.window?.rootViewController?.view.addSubview(view)

这对我来说很好用!

【讨论】:

状态栏高度应该是动态的,颜色需要考虑UIUserInterfaceStyle【参考方案8】:

tintColor 和更改UINavigationBar 的背景颜色有一个主要区别。我认为最好的方法是应用背景图像,由 1 像素的正方形图像制成,只有一种颜色。 像这样:

let tabbarAndNavBarBkg = UIImage(named: "nav_tab")
UINavigationBar.appearance().setBackgroundImage(tabbarAndNavBarBkg, forBarMetrics: .Default) 

或者您可以在UIColor 上创建一个类别以在给定UIColor 实例的情况下返回UIImage,在objC 中:

+ (UIImage *) imageWithColor:(UIColor*) color 
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);
    UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return colorImage;

【讨论】:

我试过这个没有成功。我应该在顶部应用视图吗?我该怎么做呢? 如果你用第一行写的纯色创建图像,它可以工作吗? 我用纯色创建了图像,它不起作用。我编辑了我的原始帖子。我添加了一个视图,它似乎在它完成加载后被 UITabBarController 向上推? 除了调用我在 applicationDidFinishLaunching 中发布的内容外,您无需执行任何操作。如果它不起作用,则可能是您做错了什么,或者所提供的信息对于您的项目状态并不完全正确。你确定图片是从 colo 方法调用图片后创建的吗? 是的,正在调用图像,但它仅适用于导航栏区域。状态栏仍然是白色的。如果我现在可以的话,我会发布一张图片。【参考方案9】:

UINavigationBar.appereance() 适用于即将到来的 viewController,但不适用于当前显示的 rootViewController。为此,我在didFinishLaunchingWithOptions 中添加了以下内容:

UINavigationBar.appearance().tintColor = myColor

let navigationController = UIApplication.sharedApplication().windows[0].rootViewController as! UINavigationController
navigationController.navigationBar.barTintColor = myColor
navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : myTextColor]
navigationController.navigationBar.translucent = false

navigationController.setNeedsStatusBarAppearanceUpdate()

【讨论】:

不幸的是,这也不能解决我的问题。它实际上是通过一个初始的 UIView 被绑定到这个视图(UITabBarController)的。

以上是关于iOS自定义状态栏背景颜色不显示的主要内容,如果未能解决你的问题,请参考以下文章

状态栏背景颜色不会更改为自定义颜色

自定义iOS7导航栏背景,标题和返回按钮文字颜色

如何自定义状态栏图标和文字颜色?例如。状态栏背景:白色,状态栏图标颜色,文字:红色

自定义iOS导航栏背景,标题和返回按钮文字颜色

更改标签栏中活动整个部分的颜色 - iOS 7

Swift - 状态栏颜色显示(字体背景)