在作ViewControlller的navigationItem時,咱們常常須要使用自定義的圖片來替換系統默認的按鈕樣式,這點在對普通導航項,好比leftBarButtonItem或rightBarButtonItem來講仍是比較簡單的,經過UIBarButtonItem的setImage設置作好的圖片按鈕,而後再經過api
[item setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
去掉默認的背景image就能夠了。可是若是是想自定義特殊的backBarButtonItem就比較麻煩了,直接使用和普通item同樣的方法,會發現根本沒有效果,這是由於就算同爲UIBarButtonItem,back方式的處理也是和通常的不同的,api裏專門提供了一套setBackButtonXXX的api,如setBackButtonBackgroundImage來提供給UIBarButtonItem用做back button時的參數設置,雖然也有setBackButtonBackgroundImage能夠用,可是替換完會發現圖片被以局部拉伸平鋪的方式適應了按鈕的大小,這樣若是你的圖片按鈕能夠這麼作,好比和默認效果累死,只是換個顏色,換個邊框,或者甚至是也支持這種局部拉伸平鋪的作法,就還好說,調整一下拉伸範圍參數就能夠了,可是若是是固定圖形,不像自適應拉伸的話就比較麻煩了,本人試了幾種操做組合,發現不是須要去掉button title就是背景重疊,各類效果不對。這時看到有人說自定義backBarButtonItem確實比較麻煩,建議能夠以hide的方式隱藏默認返回按鈕,同時配合leftBarButtonItem樣式和自定義響應函數中調用navigation的pop來實現相似效果,這種方法雖然確實可行,可是總感受有默認的行爲(並且當前頁的back實際是顯示在導航切換到的下一頁上的,直接替換還要考慮這點!)不用而本身模擬替代這樣不是很妥,因而又查找了一些資料,終於找到了能夠在不縮放圖片,不去掉title的前提下,替換backBarButton圖片的方法:app
UIImage* image = [UIImage imageNamed:@"back_button.png"]; [item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [item setBackButtonTitlePositionAdjustment:UIOffsetMake(-400.f, 0) forBarMetrics:UIBarMetricsDefault]; self.navigationItem.backBarButtonItem = item;
原理很簡單,第一行加載圖片,第二行以加載圖片的寬度結合resizableImageWithCapInsets生成一個縮放時不會拉伸的新圖片做爲BackButtonBackgroundImage,再在第三行設置title的位置偏移到一個不可見的位置,達到隱藏的目的。另外,若是須要所有統一替換,也能夠在app的didFinishLaunching裏通[UIBarButtonItem appearance]所有統一替換!ide