删除 UINavigationBar 上的背景图像

Posted

技术标签:

【中文标题】删除 UINavigationBar 上的背景图像【英文标题】:Remove Background Image on UINavigationBar 【发布时间】:2012-01-13 03:00:20 【问题描述】:

我的应用程序使用导航控制器,并在主页的导航栏中显示图像。背景图片是通过放置来完成的

[navigationController.navigationBar setBackgroundImage:navImage forBarMetrics:UIBarMetricsDefault];
[_window addSubview:navigationController.view];

在应用委托中。导航栏很好地显示了这个图像。

所有其他视图不会在导航栏中显示图像。因此,当推送任何其他视图控制器时,我需要删除此背景图像。有谁知道如何做到这一点?

网上有很多关于添加或更改导航栏图像的答案,但这个问题有点不同。先感谢您。

【问题讨论】:

【参考方案1】:

要在 ios 5 或更高版本中删除 UINavigationBar 背景,您应该这样做:

[navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

希望对你有帮助

【讨论】:

这看起来应该可以工作,但是如果我传递一个真实的图像,这个功能只会改变我的任何东西。 不起作用。正如 rgbrgb 所说。它只对有效图像执行某些操作。 XCode 6.4 将不接受图像的 nil 值。【参考方案2】:

我相信这是 iOS5 的第一个实际答案,主要问题是完成后“删除”背景图像。好吧,只需保留现有图像,完成后将其放回即可。

@implementation MyViewController 
    UIImage *_defaultImage;


- (void)viewWillAppear:(BOOL)animated    
    _defaultImage = [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar.png"] forBarMetrics:UIBarMetricsDefault];


- (void)viewWillDisappear:(BOOL)animated 
    [self.navigationController.navigationBar setBackgroundImage:_defaultImage forBarMetrics:UIBarMetricsDefault];

【讨论】:

有趣的方法!【参考方案3】:

您可以使用在运行时创建的空白图像来设置背景图像。

UIGraphicsBeginImageContextWithOptions(CGSizeMake(36, 36), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[[UINavigationBar appearance] setBackgroundImage:blank forBarMetrics:UIBarMetricsDefault];

在运行时创建空白图像: How to create a blank transparent png in Objective-C?

【讨论】:

【参考方案4】:

这里没有什么对我有用。在搜索了几个小时后,唯一有效的方法是关注 Apple 提供的 source code example。

我放置了下面的代码,它工作并最终从其他视图控制器中删除了导航栏图像!!

// Reset everything about navigation bar. (Other flows' background image used to show up on another view controller)
    self.navigationController!.navigationBar.setBackgroundImage(nil, for: .default)
    self.navigationController!.navigationBar.setBackgroundImage(nil, for: .compact)
    self.navigationController!.navigationBar.barTintColor = nil
    self.navigationController!.toolbar.barTintColor = nil
    self.navigationController!.toolbar.isTranslucent = true

希望这对某人有所帮助。

干杯

【讨论】:

【参考方案5】:

看起来最简单的方法是:

1) 设置首页导航栏的alpha为0.000001

2) 将背景图像放在导航栏“后面”的 UIImageView 中(现在很清楚)

3) 当视图被推送/弹出时,使用 viewWillAppear / viewWillDisappear 将导航栏的不透明度设置为 1 或 0.00001。

【讨论】:

以上是关于删除 UINavigationBar 上的背景图像的主要内容,如果未能解决你的问题,请参考以下文章

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

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

在iPad上的UINavigationBar横向居中徽标

rightBarButtonItem.enabled 从 uinavigationbar 中删除我的自定义层

iOS:删除 UINavigationBar 动画

更改 UINavigationBar 外观背景图像时状态栏颜色更改