若是你想在導航欄/工具欄定製一個帶左箭頭的Bar Button Item,那麼有三種可能的方法:ide
q用png圖片定製Bar Button Item ;工具
q用png圖片定製Button ,而後addSubviews至導航欄/工具欄。spa
q使用私有API按鈕類型101,而後addSubviews至導航欄/工具欄;.net
如今比較三種方法之異同:orm
1、第1種方法:用png圖片定製BarButton Item圖片
UIBarButtonItem* buttonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"backbutton_alpha.png"]get
style:UIBarButtonItemStylePlainit
target:selfio
action:@selector(goBackAction)];select
toolbar.items = [NSArray arrayWithObjects:buttonItem,nil];
這種方法須要爲BarButtonItem準備一張mask圖片backbutton_alpha.png。backbutton_alpha.png圖片將做爲BarButtonItemd的mask(遮罩)圖片,與tintcolor一塊兒產生一張背景圖片。你不能用通常的png圖片,不然按鈕會呈現一個實心的方塊。通常的png圖片,須要經過photoshop等進行處理。好比backbutton_alpha.png其實是由backbutton_blue.png圖片通過‘mask to alpha ’處理獲得的。結果處理後的backbutton_alpha.png,只保留了原圖的alpha通道信息。
這種方法的好處在於,BarButtonItem的顏色是根據工具欄/導航欄的tintcolor而變的。如上圖的第1個按鈕,無論工具欄/導航欄的tintcolor作何調整,BarButtonItem的顏色會隨之調整,你不須要準備新的圖片。缺點是,BarButtonItem不會保留原圖的效果(由於顏色信息丟失),它的顏色會比其餘兩種方法制做的要淺些。
2、第2種方法:用png圖片定製Button ,而後addSubviews至導航欄/工具欄
//導航按鈕"返回"=======
UIButton* btn = [UIButtonbuttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(80, 8, 47, 28);
[btnsetImage:[UIImageimageNamed:@"backbutton_green.png"] forState:UIControlStateNormal];
[btnaddTarget: selfaction: @selector(goBackAction) forControlEvents: UIControlEventTouchUpInside];
[toolbaraddSubview: btn];
這種方法制做的按鈕見上圖的第二個按鈕。如代碼所示,放在工具欄/導航欄上的按鈕實際上已經不是BarButtonItem了,而是一個custom button。所以須要爲它準備一張png位圖。若是工具欄/導航欄的tintcolor發生改變,按鈕的顏色樣式仍然會是原來的樣子,而不會自行調整。因此當工具欄/導航欄的tintcolor發生變化,你須要及時更換custom button的背景圖片。優勢是,因爲使用的是位圖,這個按鈕能夠顯示得很是個性和真實。
3、 第3種方法:使用私有API按鈕類型101,而後addSubviews至導航欄/工具欄
UIButton* button = [UIButton buttonWithType:101];// left-pointing shape!
[button addTarget:self action:@selector(goBackAction)forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"返回1111" forState:UIControlStateNormal];
button.frame = CGRectMake(140, 7, 87, 28);
[toolbar addSubview: button];
第3種方法本質上仍然同第2種方法,是UIButton的定製而不是BarButtonItem的定製, 如上圖第3個按鈕所示。
蘋果的UIButtonType並不單單是API中申明的5個枚舉值。超過100的UIButtonType將顯示一些特殊的按鈕。好比101就是一個backButton樣式的導航按鈕,110則指定各類tintcolor的水晶按鈕。可是這些undocumented的UIButtonType屬於蘋果「私有API」,可能在新的iOS版本中得不到支持。
但這種方法的好處在於,你不須要讓美工爲你製做專門的按鈕圖片。並且它的標題是能夠設置的(圖片則不行,一旦製做好就不能更改),當文字內容較多時,你還能夠指定按鈕的frame大小,讓按鈕大小天然改變,以容納更多標題文本。
遺憾的是,這種方法沒法讓按鈕顏色根據工具欄/導航欄的tintcolor進行調整。UIButton仍然有tintcolor屬性,但一旦你修改UIButton的tintcolor屬性,按鈕就會失去原有的樣式,變成一個Round Rect Button。因此你只能以默認的顏色(藍色)使用這種類型的按鈕(UIButtonType=101)。
4、 結論
儘可能採用第2種方法。
demo位於:http://download.csdn.net/detail/kmyhy/4902209。