工具列按鈕有3種主要的定製方法:1、在Interface builder中定製;2、setItems方法定製;3、addSubview方法定製。
最簡單的方法是在Interface builder中定製。這種方法只需在Interface builder中將Bar Button Item的style設定為Plain,然後修改image屬性就可以了。
但是,這種方式很可能不是你想要的結果。如果你有一張按鈕圖片,是這樣的:
那麼你用這種方式,很可能只能得到這樣的結果:
工具列上只顯示了一個灰色的方塊。為什麼會這樣?這是因為Bar Button Item並不是用你設定的圖片作為按鈕的背景圖片。它用這張圖片做了一張遮罩(即捨棄所有的顏色資訊,只留取alpha值,你可以參考蘋果 Quartz2D編程指南中的位元影像及遮罩一節),然後和Tool Bar的背景圖進行了位元影像遮罩處理。因此不管你提供了什麼樣子的位元影像,Bar Button Item只會用到其中的alpha通道。由於你提供的位元影像是一張普通的圖片,alpha通道除了透明部分外,其他像素的alpha值都是一樣的(alpha=1),所以遮罩合成後,只會顯示位元影像的輪廓,無法顯示其中的文字和細節。
因此,為了顯示按鈕圖片中的文字,我們必須對這張圖片進行特殊處理。首先用圖形編輯工具(如photoshop)開啟它,使用濾鏡中的Color Controls功能調整色彩飽和度、亮度和對比,讓它變成一張灰階圖片(色彩飽和度調整為0):
然後用濾鏡中的Mask to Alpha功能,將灰階轉換成alpha值:
乍一看,好像圖片變成空白了,其實不是,它只是把原來的顏色值轉換為了alpha值,並且用不同透明度的白色表示。
好的,儲存對圖片的編輯。重新運行程式:
現在,按鈕根據位元影像的alpha值顯示,由於遮罩的原因,所有的顏色資訊丟失,按鈕只呈現了灰階漸層效果,而不是色彩坡形效果。
如果你對這個結果不滿意,那麼你只能用另一種方法:addSubview方法了。這個方法需要用代碼實現:
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame =CGRectMake(205, 5, 38, 38);
[btn setBackgroundImage:[UIImage imageNamed:@"按鈕-返回1.png"] forState:UIControlStateNormal];
[btn addTarget: self action: @selector(goBackAction) forControlEvents: UIControlEventTouchUpInside];
[toobar addSubview: btn];
其中,按鈕-返回1.png是一張顏色圖片:
程式啟動並執行結果是:
我們可以看到,位元影像的顏色資訊仍然可用的,它也不需要你用圖形編輯工具進行特殊處理。這個方法唯一不便的地方,是程式員必須自己計算按鈕控制項的frame。
最後是setItems方法。其實它跟第1種Interface builder方法並沒有多少區別,仍然要對位元影像進行遮罩處理,因此它的實現也依賴於你的圖形編輯技巧。只不過,它是用代碼實現而不是用IB,因此要寫類似如下的代碼:
UIImage* img1=[UIImage imageNamed:@"按鈕-返回2.png"];
UIBarButtonItem*barItem1 = [[UIBarButtonItem alloc]
initWithImage:img1
style:UIBarButtonItemStylePlain
target:self
action:@selector(goBackAction)];
[toobar setItems:[NSArray arrayWithObjects:barItem,barItem1,nil]];
轉自:http://www.oschina.net/question/54100_36173