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, вы получите исключение, если попытаетесь использовать его с меньшей версией.