2009-12-02 88 views

回答

59

更新:請參閱MANIAK_dobrii's answer以獲得更簡單的解決方案,可在iOS 7+中使用。


這裏是我使用的圖像獲得的UIBarButtonItem:

UIImage *image = [UIImage imageNamed:@"buttonImage.png"]; 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.bounds = CGRectMake(0, 0, image.size.width, image.size.height);  
[button setImage:image forState:UIControlStateNormal]; 
[button addTarget:myTarget action:@selector(myAction) forControlEvents:UIControlEventTouchUpInside];  
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
… 
+0

如果你想在您的按鈕標題你可能想改變setImage行了setBackgroundImage。如果沒有,那麼上面的代碼工作得很好。 – rein 2009-12-02 20:11:40

+0

非常感謝 – vodkhang 2010-08-26 10:38:03

+3

不要忘記'button.showsTouchWhenHighlighted = YES',這樣按鈕就會像標準的UIBarButtonItem一樣點亮。 – azdev 2011-12-19 03:35:16

7

都能跟得上。正如你可以在Human Interface Guidelines

看你自己的圖標的外觀決定後,在創建它遵循以下原則:

使用PNG格式。 使用適當的alpha純白色。 請勿包含陰影。 使用抗鋸齒。 如果您決定添加斜角,請確保它是90°(爲了幫助您實現此目標,請將光源置於圖標頂部)。 對於工具欄和導航欄圖標,創建一個大小爲20 x 20像素的圖標。 對於選項卡欄圖標,創建一個大小爲30 x 30像素的圖標。

注意:您爲工具欄,導航欄和選項卡欄提供的圖標用作蒙版以創建您在應用程序中看到的圖標。 沒有必要創建一個全綵圖標。

44

還有其他iOS7 +解決方案:從UIImage.h

NSString *iconFilename = // ... 
UIImage *image = 
    [[UIImage imageNamed:iconFilename] 
     imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
UIBarButtonItem *barButtonItem = 
    [[UIBarButtonItem alloc] initWithImage:image 
            style:UIBarButtonItemStylePlain 
            target:self 
            action:@selector(onBarButtonItemTapped:)]; 

提取物:

...導航欄,標籤欄,工具欄和分段控制自動對待自己的前景圖像作爲模板...您可以使用UIImageRenderingModeAlwaysTemplate強制您的圖像始終呈現爲模板或UIImageRenderingModeAlwaysOriginal,以強制您的圖像始終呈現爲原始圖像。

+4

這應該是被接受的答案。 – Apfelsaft 2015-11-01 01:42:45

+0

@Apfelsaft - 它可能是,如果iOS 7在2009年存在,當問題被問到:)我已經編輯了接受的答案來鏈接到這個。 – ToolmakerSteve 2017-03-23 03:28:23

21

還有一種根本不涉及編碼的方法。

首先,將要放置在欄上的圖像放置在Assets.xcassets文檔上。

選擇資產瀏覽器上的圖像。

Select the image

打開屬性檢查器中爲右側垂直工具欄上的形象。

Attributes inspector

在 「渲染爲」 選擇 「原始圖像」。

Original Image

即使在故事板上的按鈕將繼續在原始圖像將顯示在模擬器中運行時,要與色調的顏色畫。

Simulator

用於圖像的默認的呈現模式從一個UI控制到另一個而變化。但是,如果在屬性檢查器上設置此參數,則可以強制使用特定的呈現模式始終表示圖像。

如果您需要在不同控制器上使用不同渲染模式表示的相同圖像,那麼MANIAK_dobrii的響應更爲合適。

+0

完美答案! – 2016-05-23 19:00:28

+0

謝謝,這是更清潔 – ekscrypto 2018-01-17 16:21:48

6

在斯威夫特3:

let iconname = // ... 
let image = UIImage(named: iconname)?.withRenderingMode(.alwaysOriginal) 
let barButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self. onBarButtonItemTapped)) 
self.navigationItem.leftBarButtonItem = barButtonItem 
相關問題