2013-10-15 3 views
62

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

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

ответ

170

Я провел вечер, пытаясь понять это. Вы были очень близки к решению. Хитрость заключается в создании экземпляра 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]; 

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

+15

Я не вижу, как отличаются два утверждения выше. Учитывая все, что я знаю об objc, они не должны! это просто тот же оператор, сжатый в одну строку и без назначения временных переменных ... Что я не получу здесь? Есть ли что-то фундаментальное в языке, который я испортил, или это то, что я просто что-то пропустил? – entropy

+1

@ энтропия, честно говоря, это именно то, что я потратил на вечер. Кажется, что нет никакой разницы между двумя, но последняя работает, а первая - нет. Может быть ошибкой в ​​SDK. – ScorpionKing2k5

+0

Я согласен с @entropy, это какое-то странное вуду. Я не вижу, как это может быть ошибкой в ​​SDK. Может ли это быть побочным эффектом ARC? – hatfinch

-4

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

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

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

+8

Не используйте блок try-catch ... вместо этого проверяйте это вместо [image отвечаетToSelector: @selector (imageWithRenderingMode :)]; – LightningStryk

+2

@LightningStryk прав - приведенный выше пример не является рекомендуемым способом вызова API, который может быть недоступен. Используйте метод responsesToSelector. – DiscDev

9

Для Swift 2.1+ это будет выглядеть следующим образом:

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

ОБНОВЛЕНО Swift 3

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

Есть ли другой способ? Как особый тип изображения, который не требует установки 'UIImageRenderingModeAlwaysOriginal'? –

+1

@ jesses.co.tt Мой друг, ты спас мой день! Это было ТОЧНО, что я искал весь этот день. Большое спасибо! – DccBr

+0

Рад, что это помогло! –

9

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

Смежные вопросы