使用圖片方式自定義iOS導航欄navigationItem的backBarButtonItem

http://blog.k-res.net/archives/1585.html

在做ViewControlllernavigationItem時,我們經常需要使用自定義的圖片來替換系統默認的按鈕樣式,這點在對普通導航項,比如leftBarButtonItemrightBarButtonItem來說還是比較簡單的,通過UIBarButtonItemsetImage設置做好的圖片按鈕,然後再通過

1

[item setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

去掉默認的背景image就可以了。但是如果是想自定義特殊的backBarButtonItem就比較麻煩了,直接使用和普通item一樣的方法,會發現根本沒有效果,這是因爲就算同爲UIBarButtonItemback方式的處理也是和一般的不一樣的,api裏專門提供了一套setBackButtonXXXapi,如setBackButtonBackgroundImage來提供給UIBarButtonItem用作back button時的參數設置,雖然也有setBackButtonBackgroundImage可以用,但是替換完會發現圖片被以局部拉伸平鋪的方式適應了按鈕的大小,這樣如果你的圖片按鈕可以這麼做,比如和默認效果累死,只是換個顏色,換個邊框,或者甚至是也支持這種局部拉伸平鋪的做法,就還好說,調整一下拉伸範圍參數就可以了,但是如果是固定圖形,不像自適應拉伸的話就比較麻煩了,本人試了幾種操作組合,發現不是需要去掉button title就是背景重疊,各種效果不對。這時看到有人說自定義backBarButtonItem確實比較麻煩,建議可以以hide的方式隱藏默認返回按鈕,同時配合leftBarButtonItem樣式和自定義響應函數中調用navigationpop來實現類似效果,這種方法雖然確實可行,但是總感覺有默認的行爲(而且當前頁的back實際是顯示在導航切換到的下一頁上的,直接替換還要考慮這點!)不用而自己模擬替代這樣不是很妥,於是又查找了一些資料,終於找到了可以在不縮放圖片,不去掉title的前提下,替換backBarButton圖片的方法:

1

UIImage* image = [UIImage imageNamed:@"back_button.png"];

2

[item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

3

[item setBackButtonTitlePositionAdjustment:UIOffsetMake(-400.f, 0) forBarMetrics:UIBarMetricsDefault];

4

self.navigationItem.backBarButtonItem = item;

原理很簡單,第一行加載圖片,第二行以加載圖片的寬度結合resizableImageWithCapInsets生成一個縮放時不會拉伸的新圖片作爲BackButtonBackgroundImage,再在第三行設置title的位置偏移到一個不可見的位置,達到隱藏的目的。另外,如果需要全部統一替換,也可以在appdidFinishLaunching裏通[UIBarButtonItem appearance]全部統一替換!

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