Сохранение исходного цвета изображения выбранных и невыделенных значков UITabBar
Структура следующая:
В моей раскадровке у меня есть Tab Bar Controller
который содержит объект Tab Bar
. Этот объект имеет собственный класс, в котором у меня есть только этот метод:
- (void)awakeFromNib
{
NSArray *imageNames = @[@"test1", @"test2", @"test3", @"test4", @"test5"];
for (int i=0; i<5; i++) {
UITabBarItem *item = [self.items objectAtIndex:i];
NSString *imageName = [imageNames objectAtIndex:i];
item.image = [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
item.selectedImage = [UIImage imageNamed:[imageName stringByAppendingString:@"-selected"]];
}
}
Я создал Asset Catalog
который содержит значки панели вкладок, как выбранные, так и невыбранные версии (разные цвета).
В документации для UIImageRenderingModeAlwaysOriginal
упоминается Всегда рисовать исходное изображение, не рассматривая его как шаблон. который должен сохранить исходный цвет изображения. Похоже, этого не произошло, и это предложение не сработало.
Вместо этого происходит то, что в выбранном состоянии мои значки панели вкладок получают синий оттенок по умолчанию.
Одна вещь, которую я заметил, это то, что если я сделаю следующее (взято отсюда) в didFinishLaunchingWithOptions
в AppDelegate
, то я могу установить цвет значков выбранной панели вкладок, как я хочу:
[[UITabBar appearance] setTintColor:[UIColor purpleColor]];
Документация для setTintColor
упоминает:
Цвет оттенка, применяемый к элементам панели вкладок панели вкладок. Начиная с iOS 7.0, цвет оттенка, который применяется к элементам панели вкладок панелей вкладок, является первым нецветным оттенком цвета в иерархии представления, начиная с самой панели вкладок.
Означает ли это, что независимо от цвета значков панели вкладок (оригинал на самих изображениях), в выбранном состоянии они всегда будут иметь цвет tintColor
?
Или я что-то делаю не так/что-то упустил?
У меня эта проблема на iOS 7.0 и 7.1.
Ответы
Ответ 1
Отличный вопрос, очень хорошо объясненный.
Вы не устанавливаете imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
для выбранного изображения.
Просто должен добавить imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
к selectedImage
:
item.selectedImage = [[UIImage imageNamed:[imageName stringByAppendingString:@"-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
Проверьте этот ответ.
Ответ 2
Просто перейдите к свойствам свойств вашего изображения и установите для свойства Render as "исходное изображение"
И ты в порядке!
Ответ 3
Swift 3:
for item in self.tabBar.items!{
item.selectedImage = item.selectedImage?.withRenderingMode(.alwaysOriginal)
item.image = item.image?.withRenderingMode(.alwaysOriginal)
}
Ответ 4
Установка невыбранного изображения для всегда оригинального рендера и выбор одного для всегда рендеринга шаблона сделали свое дело для меня.
Решение для iOS 13 и swift 5.1
let item = UITabBarItem(title: "item_title",
image: UIImage(named: "img")?.withRenderingMode(.alwaysOriginal),
selectedImage: UIImage(named:"img_selected")?.withRenderingMode(.alwaysTemplate))