UINavigationItem返回按鈕自定義設置
本文主要介紹在我們使用UINavigationController的時候, 怎麼合理的設置返回鍵, 其實, 如果我們不設置, 其實系統有默認的樣式, 但是如果我們想要自定義返回按鈕, 也是可以辦到的, 但是會出現各種問題, 這裏就大致介紹在自定義backBarButtonItem的時候, 我們會遇到哪些意想不到的情況.
backBarButtonItem默認樣式
首先, 我們先來看看系統默認的樣式:一般都是這種樣式
這是一種很常見的方式, 但是如果我們想要修改backBarButtonItem的樣式, 例如修改標題爲”返回”?, 這個其實很容易辦到的:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
以上代碼就可以實現, 但是這個是要在前一個viewController中實現, 而不是在當前push出來的viewController中設置, 不然是沒有效果, 這個到底是什麼原因呢? 那我們就先來看看backBarButtonItem顯示的優先級問題.
backBarButtonItem顯示的優先級
關於優先級問題, 大致分爲以下三點:
我們使用A push到 B爲例來解釋:
1.如果B中設定了leftBarButtonItem, 那麼返回按鈕就是B中的leftBarButtonItem.
2.如果B中沒有設置leftBarButtonItem, 而在A中設定了backBarButtonItem, 那麼就會顯示A中設定的backBarButtonItem.
3.如果以上兩點都沒有滿足, 那麼就是最原始的顯示, 像之前顯示系統爲我們設定的默認樣式.
關於backBarButtonItem的顯示優先級, 大致可以這樣解釋, 從中我們也可以看出, 使用leftBarButtonItem也可以充當backBarButtonItem的角色, 其實, 一般來說, 我們也是這樣做的, 這樣做主要是基於這樣一點考慮: 使用leftBarButtonItem我們可以定義返回時間, 使用backBarButtonItem我們不容易在返回之前處理一些我們自定義的事情, 至於如何截取系統的backBarButtonItem事件, 大家可以看看這篇文章自定義backBarButtonItem
接下來我們就介紹使用leftBarButtonItem來實現backBarButtonItem的功能.
leftBarButtonItem設定的一些問題
一般使用leftBarButtonItem我們會這樣做:
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backAction:)];
或者這樣:
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"nav_bar_back_icon_white"] style:UIBarButtonItemStylePlain target:self action:@selector(backAction:)];
其實, 一般我們會使用圖片代替文字, 但是這樣做有個問題, 先來看看效果圖吧:
其實, 我們可以發現二者離左邊界的距離並不一樣, 我們當然是不希望出現這種情況的, 那這裏就給出一種解決方法:
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"nav_bar_back_icon_white"] style:UIBarButtonItemStylePlain target:self action:@selector(backAction:)];
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceItem.width = - 10;
self.navigationItem.leftBarButtonItems = @[spaceItem, leftItem];
看看效果:
我們可以根據spaceItem.width來調整距離, 達到我們想要的效果, 這個也使我們使用leftBarButtonItem來實現backBarButtonItem會遇到的問題, 但是個人覺得並不是非常完美, 我覺得合理的解決方法是這樣的.
合理解決backBarButtonItem問題
1.首先, 我們可以全局設定navigationBar的返回樣式, 這個可以查看我的另一篇博客iOS開發中全局修改UINavigationBar的樣式
2.因爲一般而言, 整個app中的返回樣式都是一樣的, 可以全局設定, 然後如果個別controller需要截取返回事件, 可以按照文中的方法來實現, 個人覺得這樣做事比較靠譜的. 也建議大家採用這種方法.
總結
總而言之, 我們在使用backBarButtonItem的時候, 會遇到一些問題, 這裏大致簡述我的解決方法, 希望對遇到類似問題的小夥伴有幫助.