Как правильно настроить UITabBar и UITabBarItem на iOS 7 и iOS 8?

Я так много гуглю, но нигде не нахожу прямой и консолидированная ответ.

Я хочу настроить мойUITabBarController такое, что:

  1. the UITabBar сам полностью черный
  2. цвет текста заголовков элементов белый в не выделена государство
  3. цвет текста заголовков элементов красный в выделена государство
  4. использовать разноцветные иконки в панели вкладок

1. Поворот UITabBar черный

Я предполагаю, что мне нужно использовать UIAppearance API для этого, и на самом деле я смог превратить UITbarBar черный использование: [[UITabBar appearance] setBarTintColor:[UIColor blackColor]];.

2. и 3. Изменить цвет заголовков элементов

тем не менее, цвет текстовых элементов, похоже, не делает то, что я хочу, после поиска в интернете, следующие решения имели смысл для меня, но он только изменяет не выделена состояние до белого, выделена также остается белым...

NSDictionary *titleAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
[[UITabBarItem appearance] setTitleTextAttributes:titleAttributes forState:UIControlStateNormal];

UIColor *titleHighlightedColor = [UIColor redColor]; 
NSDictionary *highlightedTitleAttributes = @{NSForegroundColorAttributeName : titleHighlightedColor};
[[UITabBarItem appearance] setTitleTextAttributes:highlightedTitleAttributes forState:UIControlStateHighlighted];

4. Разноцветные предметы

о разноцветных значках, до сих пор подход был просто установить значки в раскадровки такой:

enter image description here

но это не делает то, что я хочу, он показывает только весь значок в сером цвете, когда элемент не выбранные. Когда элемент выбран, значок полностью исчезает.

это оригинальный значок:

enter image description here

вот как это выглядит, когда элемент не избранные:

enter image description here

и вот он в выбранном изложении, как уже упоминалось, значок полностью исчезает:

enter image description here

Итак, мой вопрос заключается в том, как именно я могу достичь вышеупомянутых требований. Чего мне сейчас не хватает? Лучше ли мне делать все в коде, чем в Раскадровки?

Примечание: я нацелен на версии iOS больше 7.0, поэтому, пожалуйста, включите любую конкретную информацию о версии, если поведение отличается между iOS 7 и iOS 8.

2 ответов


у меня была та же проблема, что и у вас. Насколько я знаю, нет разницы для разных версий iOS.
Я решил это программно следующим образом:

  1. поворот черного цвета бара работает следующим образом (Вы уже сказали это) (в AppDelegate):

    UITabBar.appearance().barTintColor = UIColor.blackColor()

  2. чтобы установить цвет заголовка для разных состояний, я использовал этот код (в AppDelegate):

    UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName!: UIColor.redColor()], forState:.Selected)
    UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName!: UIColor.whiteColor()], forState:.Normal)
    
  3. (и 4.) Вы можете получить разные цвета элементов, разноцветные значки и разные цвета элементов для разных состояний, установив изображение программно и изменив режим рендеринга (imageWithRenderingMode:) к UIImageRenderingMode.AlwaysOriginal, это выглядит следующим образом (сделайте это в первом классе контроллера вида для всех ваших контроллеров вида):

    var recentsItem = self.tabBarController!.tabBar.items![0] as UITabBarItem
    var recentsItemImage = UIImage(named:"recents.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
    var recentsItemImageSelected = UIImage(named: "recentsSelected.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
    recentsItem.image = recentsItemImage
    recentsItem.selectedImage = recentsItemImageSelected
    

Я надеюсь, что это помогает, если у вас возникли вопросы, не стесняйтесь спрашивать меня.


решение, предоставленное smudis, отлично, и потому что у меня недостаточно репутации, чтобы прокомментировать, я решил опубликовать 3-ю часть решения smudis в Objective-C, если это может кому-то помочь:

чтобы получить ссылку на tabBar введите приведенный выше код в приложение метода AppDelegate: didFinishLaunchingWithOptions:

UITabBarController *tbc = (UITabBarController*)self.window.rootViewController;
UITabBar *tb = tbc.tabBar;

затем корректировку изображения можно выполнить следующим образом:

for (UITabBarItem *tbi in tb.items) {
    tbi.selectedImage = [tbi.selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tbi.image = [tbi.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}