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