2009-12-02 2 views

ответ

59

UPDATE: См. 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

+0

спасибо большое человек – vodkhang

+3

Не забудьте 'button.showsTouchWhenHighlighted = YES', поэтому кнопка загорается, когда используется как обычный UIBarButtonItem. – azdev

7

Nope. Как вы можете прочитать в Human Interface Guidelines

После того, как вы определились с появлением значка, следуйте этим рекомендациям, как вы его создать:

Используйте формат PNG. Используйте чистый белый цвет с соответствующей альфой. Не включайте тень. Используйте сглаживание. Если вы решили добавить скос, убедитесь, что он равен 90 ° (чтобы помочь вам сделать это, представьте источник света, расположенный в верхней части значка). Для значков панели инструментов и панели навигации создайте значок размером около 20 x 20 пикселей. Для значков панели вкладок создайте значок размером около 30 х 30 пикселей.

Примечание. Значок, который вы предоставляете для панелей инструментов, навигационных панелей и полос табуляции, используется в качестве маски для создания значка, отображаемого в приложении. Нет необходимости создавать полноцветную иконку.

44

Там в другой iOS7 + решение:

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

Выписка из UIImage.h:

... навигационные панели, панели вкладок, панели инструментов, и сегментированный управления автоматически обработать их изображения переднего плана, как шаблоны ... Вы можете использовать UIImageRenderingModeAlwaysTemplate, чтобы заставить ваше изображение всегда отображаться как шаблон или UIImageRenderingModeAlwaysOriginal, чтобы заставить ваше изображение всегда отображаться как оригинал.

+4

Это должен быть принятый ответ. – Apfelsaft

+0

@Apfelsaft - возможно, это было бы, если бы iOS 7 существовала в 2009 году, когда задавался вопрос :) Я отредактировал принятый ответ на ссылку на этот. – ToolmakerSteve

21

Существует другой способ, который не включает кодирование вообще.

Сначала поместите изображения, которые вы хотите поместить на панель в документе Assets.xcassets.

Выберите изображение в обозревателе активов.

Select the image

Откройте инспектор Атрибуты для этого изображения на правой вертикальной панели инструментов.

Attributes inspector

На "Render As" выбрать "Original Image".

Original Image

Даже несмотря на раскадровке кнопки будут продолжать быть окрашены в оттенок цвета, при работе на тренажере будет показано исходное изображение.

Simulator

Режим рендеринга по умолчанию для изображения изменяется от одного элемента управления пользовательского интерфейса к другому. Однако, если вы установите этот параметр в инспекторе атрибутов, вы можете заставить изображение всегда отображаться в определенном режиме рендеринга.

Если вам нужно одно и то же изображение, которое будет отображаться с различными режимами рендеринга на разных контроллерах, тогда ответ от MANIAK_dobrii более уместен.

+0

Отличный ответ! –

+0

Спасибо, это МНОГО очиститель – ekscrypto

6

В Swift 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