NavigationBar及backBarItem调整

tabBarnavigation使用注意点:往往都是从需求而迸发出问题所在的。

问题展开:需要自定义导航栏上的返回按钮样式?

可以在navigationController控制器中进行重写方法,设置其backItem

共需要四步:

1 . 设置backButtonItem属性隐藏

 self.navigationItem.hidesBackButton = YES;

2 . 自定义一个btn

  UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [leftBtn setBackgroundImage:[UIImage imageNamed:@"header"] forState:UIControlStateNormal];
    leftBtn.frame = CGRectMake(0, 0, 38, 38);
    [leftBtn addTarget:self action:@selector(goBackAction) forControlEvents:UIControlEventTouchUpInside];

3 . 根据自定义的btn生成一个item并添加到leftBarButtonItem 不可以错哦!

  UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:leftBtn];
    self.navigationItem.leftBarButtonItem = leftItem;

4 . 创建btn的触发方法

- (void)goBackAction {
    [self.navigationController popViewControllerAnimated:YES];
}

引发问题:leftBarButtonItembackBarButtonItem有何区别
他们都属于UINavigationItem的组成部分,都显示在navigationBar上,都属于UIBarButtonItem
backBarButtonItem和leftBarButtonItem RightBarButtonItem是有区别的
区别:
如果A控制器准备PushB控制器上,设置backBarButtonItemtitleimage需要在A控制器内设置,在调用A控制器pushB设置,A.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle…..]

leftItemrightItem则是在BControllerViewDidLoad设置均可。

总结:backpush前,本控制器想设置在下一个控制器中的后退显示, 而leftrightpush出来的控制器设置

接下来是一段摘自backBarButtonItem文档上的话:

When this navigation item is immediately below the top item in the stack, the navigation controller derives the back button for the navigation bar from this navigation item. When this property is nil, the navigation item uses the value in its title property to create an appropriate back button. If you want to specify a custom image or title for the back button, you can assign a custom bar button item (with your custom title or image) to this property instead. When configuring your bar button item, do not assign a custom view to it; the navigation item ignores custom views in the back bar button anyway.

大概说明了:backBarButtonItem只能自定义imagetitle,不能重写target or action,系统会忽略其他的相关设置项。如果需要重写action,则需要自定义一个leftBarButtonItem,因为系统定义leftBarButtonItem的显示优先级比backBarButtonItem优先级高,当存在leftBarButtonItem时,自动忽略backButtonItem,达到重写backBarButtonItem的目的。

引伸:以下三个的区别

  • AF:self.navigationItem.backBarButtonItem
  • BF:self.navigationController.navigationItem.backBarButtonItem
  • CF:self.navigationController.navigationBar.backItem.backBarButtonItem

比如A控制器pushB控制器,在A设置了AF,经过试验发现,这个backBarButtonItemB控制器的CF

 @property(nonatomic, readonly, retain)UINavigationItem *navigationItem // The navigation item used to represent the view controller in a parent’s navigation bar. (read-only)

UIViewController的属性navigationItem正是被当前UINavigationBar——[UINavigationBar appearance]管理的属性。

self.navigationController.navigationItem.backBarButtonItem

则是表示当前navigationControllerparentUINavigationBar,一般情况下没有这样的嵌套。

问题:push一个控制器时,如果要将其tabBar不再展示,而返回时再展示,设置如下即可,在push之前
1 . 创建一个即将Push的控制器:

RegisterViewController *registerVC = [[RegisterViewController alloc] init];

2 . 设置其push时为隐藏Bar

registerVC.hidesBottomBarWhenPushed = YES;

3 . 设置当前控制器显示Bar(关键)

self.hidesBottomBarWhenPushed = NO;

4 . push(在此之后,所有的都不会有控制器)

[self.navigationController pushViewController:registerVC animated:YES];

补充:
如果要设置backBarItem不能只用alloc init不然便没有效果,需大致如下(属性要创建):

UIBarButtonItem *backI = [[UIBarButtonItem alloc] initWithTitle:@"我的" style:UIBarButtonItemStylePlain  target:nil action:nil];
self.navigationItem.backBarButtonItem = backI;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值