1、序
- iOS导航栏的返回按钮,一直都是开发中比较头痛的问题。
正好在做毕业设计时,想到要设置全局的返回样式,只要图片,不要文字,形式如下:
最终效果图2、思考过程
- 网上有很多种方法,但是我都认为太麻烦,所以看能不能简单的设置一个全局样式
(1)开始时,我设置了如下:
UINavigationBar * navigationBar = [UINavigationBar appearance];
//返回按钮的箭头颜色
[navigationBar setTintColor:[UIColor whiteColor]];
//设置返回样式图片
UIImage *image = [UIImage imageNamed:@"navigationbar_back"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
navigationBar.backIndicatorImage = image;
navigationBar.backIndicatorTransitionMaskImage = image;
- 以上代码实现了全局的形式如下:
(2)讨论:全局下,箭头都是自定义样式了,但是文字怎么去掉?网上的方法很多,有用到时在设置,或全局的利用运行时重载方法,问题都是没有达到简单的方法,后来找到这样一个方法如下:
- 利用全局的UIBarButtonItem,然后巧妙的设置文字的偏移值,达到“隐藏”效果
UIBarButtonItem *buttonItem = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
UIOffset offset;
offset.horizontal = -500;
[buttonItem setBackButtonTitlePositionAdjustment:offset forBarMetrics:UIBarMetricsDefault];
- 不知道这个方法是不是最简单,和这个方法是不有什么“bug”,能力有限,欢迎指点!
3、最后效果如下:
最后效果图4、快速使用方法
- (void)setNaviBack{
UINavigationBar * navigationBar = [UINavigationBar appearance];
//返回按钮的箭头颜色
[navigationBar setTintColor:[UIColor colorWithRed:0.984 green:0.000 blue:0.235 alpha:1.000]];
//设置返回样式图片
UIImage *image = [UIImage imageNamed:@"navi_back"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
navigationBar.backIndicatorImage = image;
navigationBar.backIndicatorTransitionMaskImage = image;
UIBarButtonItem *buttonItem = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
UIOffset offset;
offset.horizontal = - 500;
offset.vertical = - 500;
[buttonItem setBackButtonTitlePositionAdjustment:offset forBarMetrics:UIBarMetricsDefault];
}
5、总结
在AppDelegate里集成上面代码,应用只要push后,不设置left按钮,默认都是统一的返回图片,快不快!而且保留了系统自带的左滑返回手势
6、Bug
感谢 @binMyth 、 @简书坤 提醒,bug:
- 导航条上的返回按钮 的 相应区域 还是原来那么大 没有变为图片的大小
- 第一个界面的 title 过长 会影响 跳转到的第二界面 的 title
因为没有去改变系统的backBarButtonItem,所以位置是没有变的。
在iPhone 5s上测试:
- 如果上一级标题没有超过6个中文,那么其实下一级时,返回标题会显示完整,导致下一级标题右移了。
- 如果上一级标题超过6个中文,系统会设置”返回“,位置相对较少,标题不会右移。
当然,在iPhone 6plus上宽度更大,具有没有测试,对于一般应用,标题不会太长,是可以接受吧。谢谢大家的指正!!如果大家有更好的方法,欢迎指教!
- 如果有什么疑问,可以在评论区一起讨论;
- 如果有什么不正确的地方,欢迎指导!
注:本文首发于 iHTCboy's blog,如若转载,请注明来源。
网友评论
1.替换系统默认返回图片
- (void)viewDidLoad {
[super viewDidLoad];
self.delegate = self;
// 自定义返回图片(在返回按钮旁边) 这个效果由navigationBar控制
[self.navigationBar setBackIndicatorImage:[UIImage imageNamed:@"NavBack"]];
[self.navigationBar setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"NavBack"]];
}
2.去掉文字
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.viewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
}
// 去掉系统backBarButtonItem的默认显示效果
// 这个效果由控制器控制(A push B 则在A中设置)
/***
1、如果B视图有一个自定义的左侧按钮(leftBarButtonItem),则会显示这个自定义按钮;
2、如果B没有自定义按钮,但是A视图的backBarButtonItem属性有自定义项,则显示这个自定义项;
3、如果前2条都没有,则默认显示一个后退按钮,后退按钮的标题是A视图的标题。
*/
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:NULL];
viewController.navigationItem.backBarButtonItem = item;
[super pushViewController:viewController animated:animated];
}
#pragma mark - 自定义系统自带的backBarButtomItem
// 去掉系统默认自带的文字(上一个控制器的title),修改系统默认的样式(一个蓝色的左箭头)为自己的图片
-(void)customBackBarButtonItem {
// 去掉文字
// 自定义全局的barButtonItem外观
UIBarButtonItem *barButtonItemAppearance = [UIBarButtonItem appearance];
// 将文字减小并设其颜色为透明以隐藏
[barButtonItemAppearance setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:0.1], NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
// 设置图片
// 获取全局的navigationBar外观
UINavigationBar *navigationBarAppearance = [UINavigationBar appearance];
// 获取原图
UIImage *image = [[UIImage imageNamed:@"navigationbar_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// 修改navigationBar上的返回按钮的图片,注意:这两个属性要同时设置
navigationBarAppearance.backIndicatorImage = image;
navigationBarAppearance.backIndicatorTransitionMaskImage = image;
}
forBarMetrics:UIBarMetricsDefault];
重新测试后发现是 UIOffsetMake(NSIntegerMin, NSIntegerMin) 值设置的有问题.不能为0
第一 导航条上的返回按钮 的 相应区域 还是原来那么大 没有变为图片的大小
第二 第一个界面的 title 过长 会影响 跳转到的第二界面 的 title
其实很简单,只需减小UIBarButtonItem外观的字体大小和颜色设为透明即可,代码如下:
// 自定义全局barButtonItem样式
UIBarButtonItem *appearance = [UIBarButtonItem appearance];
// 减小文字大小并设文字颜色为透明,即可
[appearance setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:0.1], NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];