其實很早之前就已經有這個疑問了,最近正好有空就正式的實踐了一下,看了看這兩者之間究竟有身上區別.那么關于系統的導航條里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;