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

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

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

但是,我得到一个白色的状态栏,应该填充橙色,而不是以下示例: 使用swift自定义导航栏外观

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

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

有谁知道我在做什么错?

编辑:我不知道是否重要,但视图是在UITabBarController

编辑2:这实际上发生在所有的意见,而不仅仅是UITabBarController

编辑3:谢谢@Utsav Parikh

我现在在状态栏的顶部添加一个视图,在应用程序加载状态栏的时候,它是一个短暂的时间,但是一旦它完成加载,它将被closures视图,并replace为通用的白色状态栏。 为什么会这样呢?

 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) 

没有embedded式控制器

我意识到有些人来到这里不仅是为了状态栏,而是实际上导航栏,所以我学到了一些技巧,没有任何embedded式控制器:

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 } 

编辑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) 

没有embedded式控制器

我意识到有些人来到这里不仅是为了状态栏,而是实际上导航栏,所以我学到了一些技巧,没有任何embedded式控制器:

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中发挥好。 如果有人有更好的办法,让我知道,但到目前为止,这是我已经来到的解决scheme。

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) 

希望它可以帮助你….

这是我没有在NavBarController中添加视图的VC

我想状态栏的颜色和VC视图的颜色一样,所以我只写了:

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

尝试一下。

我认为你的最后一行是恢复你的改变,试试这个:

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

在你做了什么之后,在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 

你可以select任何hex代码来select你的颜色。 请享用..!!

对不起,忘了使用hex代码,你将需要这个,所以在你的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) } 

西蒙的答案很快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 } 

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

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

或者,您可以在UIColor上创build一个类别,以返回给定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; } 

UINavigationBar.appereance()适用于即将到来的viewControllers,但不适用于当前显示的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() 

Swift 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) 

这对我来说很好!