UINavigationItem返回按鈕自定義設置

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的時候, 會遇到一些問題, 這裏大致簡述我的解決方法, 希望對遇到類似問題的小夥伴有幫助.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章