1.问题描述
1.1.运行环境
Xcode版本:7.3.1
Simulator版本:8.4 & 9.3
1.2.背景
在一个项目中,导航栏的背景色为蓝色,导航栏的返回按钮为白色。然后产品化提供了蓝色的rgb数值和白色返回按钮的切图。
因为直接设置导航栏的背景色有半透明效果,所以便创建了一个纯色图片设置了导航栏的背景图片。
[self.navigationController.navigationBar setBackgroundImage:colorImage forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
其中colorImage为纯色图片。
1.3.问题
但是运行之后发现,返回按钮的图片明明是白色的,但显示出来确成了蓝色的。
2.解决方法
2.1.思路
首先通过修改图片名称,排除了存在同名资源文件的可能。
然后修改了导航栏的底色,发现返回按钮的颜色是随着导航栏的底色变化的。
最后去看导航按钮的添加代码:
UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"GDNavBar_Back"] style:UIBarButtonItemStylePlain target:self action:@selector(didBackButton)];
此处加载图片使用的是类似title的前景图片。类比一下title,UIBarButtonItem的title显示时是具有透明效果的,所以可能该前景图片也有透明效果。
但是UIBarButtonItem又不存在backgroundImage属性,所以只能通过customView进行展示。
UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 45, 40);
[btn setImage:[UIImage imageNamed:@"GDNavBar_Back"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(backToPrev) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
使用该办法后,返回图片显示正常。
2.2.结论
使用UIBarButtonItem的customView属性定制按钮。
3.原因
如上所述,尽量使用customView来定制UIBarButtonItem。