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

时间:2015-05-20 05:46:30

标签: ios swift uinavigationbar

我正在尝试使用以下

将状态栏背景颜色填充为橙色
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
}

9 个答案:

答案 0 :(得分:26)

编辑 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 中发挥出色。如果有人有更好的方式让我知道,但是,截至目前这是我已经解决的解决方案。

答案 1 :(得分:16)

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

希望它可以帮助你...... !!!

答案 2 :(得分:6)

如果没有在NavBarController中添加VC中的视图

,我就是这样做的

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

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

试试吧。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您在info.plist之后对以下内容所做的事情:View controller-based status bar appearance => NO。

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

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

答案 5 :(得分:1)

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的方法。当方向更改和键盘显示并且视图向上移动时,这有一些好处。我已经习惯了,每次都很幸运(app在应用程序商店中发布)。

func setStatusBarBackgroundColor(color: UIColor) {

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

    statusBar.backgroundColor = color
} 

答案 6 :(得分:0)

tintColorUINavigationBar的背景颜色有所不同。在我看来,最好的方法是应用背景图像,由1个像素的正方形图像制成,只有一种颜色 像那样:

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

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

+ (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;
}

答案 7 :(得分:0)

.db适用于即将推出的viewControllers,但不适用于当前显示的rootViewController。为此,我在@implementation AView - (UIView *) buildBestView { UIView *test = [[UIView alloc] init]; return test; } @end 添加了以下内容:

UINavigationBar.appereance()

答案 8 :(得分:0)

斯威夫特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)

这对我来说很好用!