UIBarButtonItem с UIImage Always Tinted 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 моего приложения, когда он загружается... может быть, это не важно в отношении моей проблемы, но я думал, что я упоминал об этом.

Ответ 1

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

Вместо этого:

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

сделайте следующее:

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

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

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

[myCustomBarButtonItem setImage:image];

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

Ответ 2

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

Ответ 3

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

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

ОБНОВЛЕНО Swift 3

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

Ответ 4

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

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

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