其实很早之前就已经有这个疑问了,最近正好有空就正式的实践了一下,看了看这两者之间究竟有身上区别.那么关于系统的导航条里backBarItem和leftBarItem有什么区别,我先贴出一个图看一下效果就知道了
我相信通过图片这个大家能够很明显的看出区别:当自定义leftBackItem的时候,手势返回的过程中,左上角的文字是渐暗的。而当自定义backBarItem的时候,返回按钮的标题会慢慢远离返回按钮,然后再pop。
还有一个需要注意的是这两者在代码的写法上也是有区别的:当自定义leftBarItem的时候,假如 A要 push B,那么自定义过程的代码其实是写在B控制器里面的;当在自定义backBarItem,代码其实是写在A控制器里面的
具体代码如下
leftBarItem:在 B 控制器中实现如下代码
UIButton *lefuButton = [UIButton buttonWithType:UIButtonTypeCustom];
lefuButton.titleLabel.font = [UIFont systemFontOfSize:17];
[lefuButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal];
[lefuButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateHighlighted];
[lefuButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[lefuButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
[lefuButton setImageEdgeInsets:UIEdgeInsetsMake(0, -10, 0, 0)];
[lefuButton setTitle:@"leftBarItem" forState:UIControlStateNormal] ;
[lefuButton sizeToFit];
[lefuButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *leftButtonItem = [[UIBarButtonItem alloc] initWithCustomView:lefuButton];
self.navigationItem.leftBarButtonItem = leftButtonItem;
backBarItem:在 A控制器中实现如下代码
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]init];
backItem.title = @"backBarItem";
//如果使用了自己的返回图片, 需要适当调整文字和图片的距离
[backItem setBackButtonTitlePositionAdjustment:UIOffsetMake(8, 0) forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setTintColor:[UIColor blackColor]];
self.navigationItem.backBarButtonItem = backItem;
如果仅仅在 A 控制器中覆盖 backBarButtonItem 的话,那 B 控制器中的返回图片还是系统的, 如果想要替换成自己的返回图片,就要在导航控制器中添加如下代码,替换系统的backIndicatorImage
UIImage *backImg = [UIImage imageNamed:@"nav_back"];
backImg = [backImg imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationBar.backIndicatorImage = backImg;
self.navigationBar.backIndicatorTransitionMaskImage = backImg;
这里,还有一个点需要大家注意一下,那就是当我们自定义了leftBarButtonItem的时候,系统的侧滑返回手势会失效,所以就需要我们遵守UIGestureRecognizerDelegate,并写下如下代码
self.navigationController.interactivePopGestureRecognizer.delegate = self;
有的时候我们不想再显示返回按钮的时候可以这么写
self.navigationItem.hidesBackButton = YES;