美文网首页生活iOS&Xcode奇技淫巧ios文章
1分钟解决iOS_backBarButtonItem问题

1分钟解决iOS_backBarButtonItem问题

作者: iHTCboy | 来源:发表于2015-04-27 20:32 被阅读14378次

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分钟解决iOS_backBarButtonItem问题

    1、序 iOS导航栏的返回按钮,一直都是开发中比较头痛的问题。 正好在做毕业设计时,想到要设置全局的返回样式,只要...

  • 报错集锦

    问题一: 解决: 问题二: 解决: 问题三: 解决: 问题四: 解决: 问题五: 解决:

  • 解决 问题 解决

    你解决一个问题,就像当于解决无数个问题。听到这句话的时候我已经毕业了。回想之前的学习经历,一张试卷,碰到难题就放那...

  • 自言自语——疯言疯语

    遇到问题,解决问题,短期解决的问题,长期解决的问题,眼前的问题,未来的问题,暂时可以解决的问题,暂时来看可以解决的...

  • Android Studio 中的小Bug(持续更新)

    问题1 解决办法 问题2 解决办法 问题3 解决办法 问题4 解决问题办法

  • 忙起来

    忙碌,能解决很多问题 解决你胡思乱想的问题 解决你彷徨迷茫的问题 解决你痴心妄想的问题 解决你自卑弱小的问题 解决...

  • 《慧杰语录》——每日必读

    劳动,解决吃饭的问题。 工作,解决生存的问题。 能力,解决存在的问题。 素质,解决关系的问题。 奋斗,解决态度的问...

  • PythonCookBook 读书笔记2-数字,日期,时间

    1 问题 解决方案 讨论 2 问题 解决方案 讨论 3 问题 解决方案 讨论 4 问题 解决方案 讨论 5 问题 ...

  • 解决问题的四种境界

    解决问题 找到根本原因解决问题 提炼并解决一类问题 教别人解决问题

  • 解决问题

    解决问题,问题真的能解决吗?问题真的是解决的吗? 回答是肯定的,问题真的不是解决,问题真的不是能被...

网友评论

  • sclcoder:以下代码写在自定义的导航控制器中
    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];
    }
  • 中峰:不建议调节文字位置,看评论,大家反映还是有点bug,可以这么做即可,更简单:
    #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;
    }
    iHTCboy:@你的名字_845b 现在很多种解方式了,如果只是俩2个特别的,你在那些控制器定制就好。
    72dfb57984c4:这样会导致普通的item文字也会消失的啊 怎么解决呢?
    中峰:只需将barButtonItem外观的文字大小减小到很小,并将其颜色设为透明,即可解决因上一级控制器title太长而下一级控制器title不居中的现象,并且不再显示上一级控制器的title。
  • 82dd32b5fec6:http://www.cnblogs.com/jijiYY/p/5455981.html这篇博客有解决返回按钮区域较大的问题,而且支持自定义返回事件
  • 704d6c3a115f: [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin)
    forBarMetrics:UIBarMetricsDefault];
    重新测试后发现是 UIOffsetMake(NSIntegerMin, NSIntegerMin) 值设置的有问题.不能为0
  • 704d6c3a115f:博主,设置 setBackButtonTitlePositionAdjustment还会导致一个问题,就是在做分享或者是支付,跳转其他APP(eg:支付宝,微信)之后,返回自己的APP的时候,会出现屏幕闪动的BUG,建议不要使用这个方法来做. 相关的简书: http://www.jianshu.com/p/77325910eea2
  • 芝华塔尼奥:@HTC 是的 现在一门语言真多不行了
  • iHTCboy:@芝华塔尼奥 哦,当然,oc还是要懂的,3年内公司的旧项目还是有oc
  • 芝华塔尼奥:@HTC 我在学习swift
  • iHTCboy:@芝华塔尼奥 嗯,如果苹果市场需求量不曝跌,那么苹果和开发者都会用swift,未来是swift
  • 芝华塔尼奥:再过一年是否就是swift了
  • 简书坤:有2个BUG
    第一 导航条上的返回按钮 的 相应区域 还是原来那么大 没有变为图片的大小
    第二 第一个界面的 title 过长 会影响 跳转到的第二界面 的 title
    rain__bow__:@中峰 这个方法会导致,打开相册等,系统自带的导航条右侧的取消按钮也是透明的,看不见了
    中峰:@baidaokun 楼主调节UIBarButtonItem外观的字的位置,建议不要这么做。
    其实很简单,只需减小UIBarButtonItem外观的字体大小和颜色设为透明即可,代码如下:
    // 自定义全局barButtonItem样式
    UIBarButtonItem *appearance = [UIBarButtonItem appearance];

    // 减小文字大小并设文字颜色为透明,即可
    [appearance setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:0.1], NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
    baidaokun:@简书坤 你好, 请问你有什么优雅的方法来解决这种问题吗?项目中遇到了,真是头疼!谢谢!打扰了!
  • iHTCboy:@binMyth 嗯,谢谢提醒,这个太长的问题我明天看看
  • b9de9d064096:这方法会有一个问题就是当前面的title很长,push过来的title就不居中了

本文标题:1分钟解决iOS_backBarButtonItem问题

本文链接:https://www.haomeiwen.com/subject/ecqvfttx.html