UINavigationBar 自定义背景图像应用于一个视图控制器,然后影响应用程序中的每个视图控制器

Posted

技术标签:

【中文标题】UINavigationBar 自定义背景图像应用于一个视图控制器,然后影响应用程序中的每个视图控制器【英文标题】:UINavigationBar custom background image applied in one view controller and then affecting every single view controller in the app 【发布时间】:2014-03-18 12:33:48 【问题描述】:

我正在使用我的应用程序中的主题。每个主题都带有一个自定义导航栏。默认情况下,我在 AppDelegate 中应用了自定义导航栏:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
UIImage *navBackgroundImage = [UIImage imageNamed:@"purplynav.png"];
[[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault];

如果我在我的应用程序和 viewWillAppear 中转到特定的表视图控制器,我会输入:

if ([self.selectedTheme isEqualToString:@"Blur"])

    UIImage *navBackgroundImage = [UIImage imageNamed:@"pastelpinknav.png"];
    [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault];

“pastelpinknav”突然被应用到我的应用程序中的每个导航栏,即使我只是在这个 Table View Controller 中设置它。

如何设置导航栏在设置时仅适用于这一视图控制器,但在未设置主题时仍设置为 App Delegate 中的默认值?

提前致谢!

【问题讨论】:

【参考方案1】:

您必须再次更改viewWillDisappear中的navigationBar图像

UIImage *navBackgroundImage = [UIImage imageNamed:@"purplynav.png"];
[[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault];

因为您使用的是[UINavigationBar appearance],所以它通常会更改UINavigationBar 的外观。

【讨论】:

这就像一个魅力 - 非常感谢 @Erik 非常及时的回复 - 真的很感激! 谢谢@Erik - 虽然答案已被接受,但我只是想问你一个简单的问题。我正在尝试对 viewWillAppear 和 viewDidDisappear 中的标签栏做同样的事情,但标签栏永远不会改变图像。我正在使用 UIImage *tabBackgroundImage = [UIImage imageNamed:@"Purplepinktop.png"]; [[UITabBar 外观] setBackgroundImage:tabBackgroundImage]; - 对吗?【参考方案2】:

从您的视图控制器调用:

[[UINavigationBar appearanceWhenContainedIn:[self class], nil] setBackgroundImage:navBackgroundImage
                                                                    forBarMetrics:UIBarMetricsDefault];

解释:

这将改变整个应用的 foo 颜色:

[[UINavigationBar appearance] setFooColor:@"blue"]

为了改变特定容器的外观(即你的视图控制器),你需要实现UIAppearanceContainer然后调用(UIViewController已经实现了它):

[UINavigationBar appearanceWhenContainedIn:(Class<UIAppearanceContainer>), ..., nil]

【讨论】:

以上是关于UINavigationBar 自定义背景图像应用于一个视图控制器,然后影响应用程序中的每个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 如何使用我的纹理背景自定义 UINavigationBar 后退按钮

UINavigationBar 自定义背景与悬垂(iOS 5)

自定义 UINavigationBar 背景适用于除一个之外的所有导航控制器

UINavigationBar 和新的 iOS 5+ 外观 API - 如何提供两个背景图像?

创建此自定义 UINavigationbar ios 的最佳方法

iOS 11 UINavigationBar 自定义背景总是在状态栏下扩展