Сохранение исходного цвета изображения выбранных и невыделенных значков 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 "исходное изображение"

enter image description here

И ты в порядке!

Ответ 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))