如何从 AppDelegate 更改 UINavigationBar 背景颜色

Posted

技术标签:

【中文标题】如何从 AppDelegate 更改 UINavigationBar 背景颜色【英文标题】:How to change UINavigationBar background color from the AppDelegate 【发布时间】:2013-06-05 13:37:24 【问题描述】:

我知道如何更改UINavigationBar 背景图片

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nabbar"] forBarMetrics:UIBarMetricsDefault];

而且我知道如何在每个 Views 中将条形设置为不同的颜色.....现在我想将背景颜色 不使用图像更改为 @ 中的纯色987654324@。我不想每次都从每个视图中设置它,也不想写CGRect

我尝试了[[UINavigationBar appearance] setBackgroundColor:[UIColor colorWithRed:33/255.0 green:34/255.0 blue:36/255.0 alpha:1.0]];,但我没有工作,而且我无法在应用程序委托中的任何地方找到代码。

谁能指点我正确的方向?

【问题讨论】:

【参考方案1】:

您可以使用[[UINavigationBar appearance] setTintColor:myColor];

ios 7 开始,您需要设置 [[UINavigationBar appearance] setBarTintColor:myColor];[[UINavigationBar appearance] setTranslucent:NO]

[[UINavigationBar appearance] setBarTintColor:myColor];
[[UINavigationBar appearance] setTranslucent:NO];

【讨论】:

谢谢,你知道如何去除顶部的白色默认渐变,使其成为纯色吗? 使用tintColor,渐变将保持不变。如果你不想有这个渐变,你需要继承你的 UINavigationBar 或者为外观制作一个 UIImage。 在 iOS 7 上不起作用,我不得不使用 navigationBar.barTintColor = myColor; translucent 属性无法在 iOS 6 和 iOS 7 中使用 UIAppearance 设置。所以[[UINavigationBar appearance] setTranslucent:NO] 将导致应用程序崩溃并出现NSInvalidArgumentException 错误。使用[self.navigationController.navigationBar setTranslucent:NO] 或使用 IB 取消选择透明度。 斯威夫特版本:UINavigationBar.appearance().barTintColor = myColorUINavigationBar.appearance().isTranslucent = false【参考方案2】:

要更改背景颜色而不是色调,以下代码将起作用:

[self.navigationController.navigationBar setBarTintColor:[UIColor greenColor]];
[self.navigationController.navigationBar setTranslucent:NO];

【讨论】:

这应该是公认的答案,适用于 iOS7。 iOS 7 的正确答案。为我工作。 半透明是完成这项工作的必要条件。由于接受的答案不包括,这应该是接受的答案。 澄清一下,接受的答案是针对 AppDelegate 的,这是针对视图控制器内部的。 @Dean 是对的。接受的答案将对新创建的UIViewControllers 生效,而此答案将在调用时显示效果。【参考方案3】:

在 iOS 7 中执行此操作:

[[UINavigationBar appearance] setBarTintColor:myColor];

【讨论】:

【参考方案4】:

Swift 语法:

    UINavigationBar.appearance().barTintColor = UIColor.whiteColor() //changes the Bar Tint Color

我只是将它放在 AppDelegate didFinishLaunchingWithOptions 中,它会在整个应用程序中持续存在

【讨论】:

【参考方案5】:

斯威夫特

self.navigationController?.navigationBar.barTintColor = UIColor.red
self.navigationController?.navigationBar.isTranslucent = false

【讨论】:

【参考方案6】:

您可以使用 Xcode 6.3.1 轻松完成此操作。在文档大纲中选择您的 NavigationBar。选择属性检查器。取消选中半透明。将 Bar Tint 设置为您想要的颜色。完成!

【讨论】:

谢谢,我找到了很多关于如何在 ObjC 和 swift 中执行此操作的参考资料,但没有人提到它在 IB 中可用【参考方案7】:

iOS 13.0 为此引入了新的 API:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    let myColor = UIColor(hue: 0.4, saturation: 0.25, brightness: 1, alpha: 1)
    
    let barAppearance = UINavigationBarAppearance()
    barAppearance.backgroundColor = myColor

    let navigationBar = UINavigationBar.appearance()
    navigationBar.standardAppearance = barAppearance
    navigationBar.scrollEdgeAppearance = barAppearance // for scrollable content or large titles
    
    return true

UINavigationBarAppearance

【讨论】:

【参考方案8】:

正如其他答案所提到的,您可以使用setTintColor:,但您想要纯色,而AFAIK 无法设置色调。

解决方案是以编程方式创建图像,并通过UIAppearance 将该图像设置为所有导航栏的背景图像。关于图像的大小,我不确定 1x1 像素的图像是否可以工作,或者您是否需要导航栏的确切大小。查看this question 的第二个答案以了解如何创建图像。

作为建议,我不喜欢用这些类型的东西“超载”应用程序委托。我倾向于创建一个名为 AppearanceConfiguration 的类,其中只有一个公共方法 configureAppearance 我在其中设置了我想要的所有 UIAppearance 内容,然后我从应用程序委托调用该方法。

【讨论】:

【参考方案9】:

您可以在任何视图控制器中使用此代码设置 UINavigation 背景颜色

self.navigationController.navigationBar.backgroundColor = [UIColor colorWithRed:10.0f/255.0f green:30.0f/255.0f blue:200.0f/255.0f alpha:1.0f];

【讨论】:

【参考方案10】:

在 Swift 4.2 和 Xcode 10.1 中

您可以将导航栏颜色从 AppDelegate 直接更改为整个项目。

didFinishLaunchingWithOptions launchOptions:下面写代码行

UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().barTintColor = UIColor(red: 2/255, green: 96/255, blue: 130/255, alpha: 1.0)

这里

tintColor用于设置背景图片,如后退按钮和菜单线条图片等。(见下方左右菜单图片)

barTintColor 用于导航栏背景颜色

如果您想设置特定的视图控制器导航栏颜色,请在viewDidLoad()中编写以下代码

//Add navigation bar colour
navigationController?.navigationBar.barTintColor = UIColor(red: 2/255, green: 96/255, blue: 130/255, alpha: 1.0)
navigationController?.navigationBar.tintColor = UIColor.white

【讨论】:

【参考方案11】:

在 iOS 中处理 UINavigationController 和 UINavigationBar 很麻烦。好在有一个开源的第三方库可以轻松解决这些问题,希望对大家有所帮助。

Git 仓库:NXNavigationExtension

改变 UINavigationBar 颜色:

extension YourViewController 
    
    override var nx_titleTextAttributes: [NSAttributedString.Key : Any]? 
        return [NSAttributedString.Key.foregroundColor: .red]
    
    

?example

【讨论】:

这似乎是您图书馆的广告。与其他答案相比,您能否详细说明该库如何添加/简化功能?【参考方案12】:

颜色代码是这里的问题。不要使用 195/255,而是使用 0.7647 或 195.f/255.f 问题是转换浮点数不能正常工作。尝试使用精确的浮点值。

【讨论】:

以上是关于如何从 AppDelegate 更改 UINavigationBar 背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 appdelegate 上更改后退按钮的文本

从 appdelegate swift 访问 UIwebview

在 Appdelegate 中设置后如何更改导航栏的色调?

在 AppDelegate 中设置 UIButton 外观时如何更改 SafariViewController 中导航栏的色调

可以在运行时更改 AppDelegate

异步请求后从 AppDelegate 更改初始视图控制器