UIBarButtonItem с UIImage, всегда окрашенным iOS 7

Я пытаюсь добавить UIBarButtonItem содержащий UIImage к UIToolbar, Изображение продолжает окрашиваться, и я не могу отобразить его как исходное цветное изображение - все, что я хочу сделать, - это дословно отобразить изображение в UIBarButtonItem! Я следую указаниям в руководстве по переходу с iOS 7, чтобы установить режим рендеринга изображений на UIImageRenderingModeAlwaysOriginal,

UIImage *image = [UIImage imageNamed:@"myImage.png"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

UIBarButtonItem *ratingImage = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStyleBordered target:nil action:nil];

[toolbar setItems:[NSArray arrayWithObjects:ratingImage, nil] animated:YES];

Стоит отметить, что я установил tintColor для основного UIWindow моего приложения, когда оно загружается... возможно, это не важно в отношении моей проблемы, но я решил упомянуть об этом.

5 ответов

Решение

Я провел вечер, пытаясь понять это. Вы были очень близки к решению. Хитрость заключается в том, чтобы создать экземпляр UIImage в режиме рендеринга.

Вместо того, чтобы делать:

 UIImage *image = [UIImage imageNamed:@"myImage.png"];
 image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

сделай это:

 UIImage *image = [[UIImage imageNamed:@"myImage.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

и это работает!

В моем случае я перетащил панель навигации в свой view-контроллер в IB и добавил BarButtonItem. Но не предоставляйте предмету изображение в IB. Сделайте розетку и назначьте ей UIImage (как мы создали выше), выполнив это:

[myCustomBarButtonItem setImage:image];

Надеюсь, что это работает для вас.

UIImageRenderingModeAlwaysOriginal также можно установить, выбрав изображение в папке "Assets.xcassets " в XCode и установив в раскрывающемся списке "Render as" значение "Исходное изображение".

Для Swift 2.1+ это будет выглядеть так:

let image : UIImage? = UIImage(named:"myImage.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)

ОБНОВЛЕНО Swift 3

let image : UIImage? = UIImage(named:"myImage.png")!.withRenderingMode(.alwaysOriginal)

Принятый ответ хорошо, но если вы разместили UIBarButtonItem в раскадровке или в Xib вы можете просто:

  • Перейти в каталог активов, где живет изображение
  • Выберите изображение
  • Перейти к инспектору атрибутов (cmd-opt-4)
  • Установите "Render As" в "Original Image"

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

Если вы хотите, чтобы он работал для версий iOS ниже v7, вам может понадобиться следующее:

UIImage *image = [UIImage imageNamed:@"myImage.png"];
@try {
  image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
} @catch (NSException *exception) {
}

Поскольку imageWithRenderingMode: является методом iOS 7, вы получите исключение, если попытаетесь использовать его с меньшей версией.

Другие вопросы по тегам