Могу ли я иметь UIBarButtonItem с цветным изображением? - PullRequest
33 голосов
/ 02 декабря 2009

У меня есть изображение, которое я хочу отобразить на UIBarButtonItem, но по какой-то причине оно показывает только его контур, а все остальное - белое. Как я могу на самом деле отобразить изображение?

Спасибо!

Ответы [ 5 ]

63 голосов
/ 02 декабря 2009

ОБНОВЛЕНИЕ: См. Ответ MANIAK_dobrii для более простого решения, доступного в 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];
…
54 голосов
/ 24 декабря 2014

Есть другое решение 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, чтобы заставить изображение всегда оформляться как оригинал.

36 голосов
/ 14 мая 2016

Есть еще один способ, который вообще не связан с кодированием.

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

Выберите изображение в браузере ресурсов.

Select the image

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

Attributes inspector

В поле «Render As» выберите «Original Image».

Original Image

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

Simulator

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

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

10 голосов
/ 09 декабря 2016

В 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
7 голосов
/ 02 декабря 2009

Неа. Как вы можете прочитать в Руководство по интерфейсу для человека

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

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

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

...