Зміна зображення та кольору тексту елемента панелі вкладок iOS


75

Ось моя панель вкладок:

введіть тут опис зображення

На наступному зображенні зображена запущена програма та вибраний пункт "НОВИНИ":

введіть тут опис зображення

Зрозуміло, що колір відтінку смужки працює нормально, як я хочу!

Але tintColor впливає лише на зображення, а не на текст.

Крім того, коли елемент вибраний (як показано вище, новини), колір товару стає синім! Як мені запобігти цьому? Я хочу, щоб він залишався білим.

Чому текст змінюється на білий колір, коли його виділено, а ні, коли його не виділено?

В основному я хочу, щоб колір елемента та колір тексту були постійно білими.

Як мені цього досягти? Дякую за будь-яку допомогу.

Чи потрібен швидкий код для кожного окремого товару?

РЕДАГУВАТИ:

введіть тут опис зображення


Чи можете ви створити зображення для всіх піктограм білого та сірого кольорів, і ви можете змінювати їх, коли це потрібно.
Макс

При виділенні зображення стає синім, а текст не виділяється білим. Не знаю чому ... це моя проблема
Грег Пекорі

Відповіді:


87

З документів класу UITabBarItem:

За замовчуванням фактичні невибрані та вибрані зображення автоматично створюються із значень альфа у вихідних зображеннях. Щоб запобігти системному забарвленню, надайте зображення з UIImageRenderingModeAlwaysOriginal.

Підказка полягає не в тому, чи використовуєте ви UIImageRenderingModeAlwaysOriginal, головне - коли його використовувати.

Щоб запобігти виділенню сірих кольорів для вибраних елементів, вам просто потрібно буде запобігти системному забарвленню для вибраного зображення. Ось як це зробити:

var firstViewController:UIViewController = UIViewController()
// The following statement is what you need
var customTabBarItem:UITabBarItem = UITabBarItem(title: nil, image: UIImage(named: "YOUR_IMAGE_NAME")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal), selectedImage: UIImage(named: "YOUR_IMAGE_NAME"))
firstViewController.tabBarItem = customTabBarItem

Як бачите, я попросив iOS застосувати оригінальний колір (білий, жовтий, червоний, який завгодно) зображення ТІЛЬКИ для НЕВИБРАНОГО стану, а зображення залишити таким, яким воно є для ВИБРАНОГО.

Також вам може знадобитися додати колір відтінку для панелі вкладок, щоб застосувати інший колір для стану ВИБРАНО (замість синього кольору iOS за замовчуванням). Як показано на скріншоті вище, ви застосовуєте білий колір для вибраного стану:

self.tabBar.tintColor = UIColor.whiteColor()

РЕДАГУВАТИ:

введіть тут опис зображення


Чи потрібно створювати клас, відповідний панелі вкладок, щоб ввести цей код?
Грег Пекорі

@GregoryPeck в AppDelegate або Створіть свій власний TabBarClass, але не забудьте призначити його за допомогою Interface Builder
Kingofmit

Як ви бачите, у мене є набір tintColor вище. Крім того, я встановив візуалізацію як оригінальне зображення, див. Редагувати.
Грег Пекорі,

І куди мені дівати кодfirstViewController.tabBarItem = customTabBarItem
Грег Пекорі

2
Вибачте за всі запитання, але я не впевнений у тому, як створити клас Tab Bar. тобто - TabBarClass: ??, ??і я, здається, не можу зв'язати це зі своєю панеллю вкладок. Це панель вкладок або контролер панелі вкладок, до якої я повинен її підключити?
Грег Пекорі,

74

Стрімкий 3

Я зробив це, створивши власний контролер панелі вкладок і додав цей код всередину viewDidLoadметоду.

    if let count = self.tabBar.items?.count {
        for i in 0...(count-1) {
            let imageNameForSelectedState   = arrayOfImageNameForSelectedState[i]
            let imageNameForUnselectedState = arrayOfImageNameForUnselectedState[i]

            self.tabBar.items?[i].selectedImage = UIImage(named: imageNameForSelectedState)?.withRenderingMode(.alwaysOriginal)
            self.tabBar.items?[i].image = UIImage(named: imageNameForUnselectedState)?.withRenderingMode(.alwaysOriginal)
        }
    }

    let selectedColor   = UIColor(red: 246.0/255.0, green: 155.0/255.0, blue: 13.0/255.0, alpha: 1.0)
    let unselectedColor = UIColor(red: 16.0/255.0, green: 224.0/255.0, blue: 223.0/255.0, alpha: 1.0)

    UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: unselectedColor], for: .normal)
    UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: selectedColor], for: .selected)

У мене це вийшло!

введіть тут опис зображення


1
У Swift 4 "NSForegroundColorAttributeName" було перейменовано на "NSAttributedStringKey.foregroundColor".
Alienbash

... а в Swift4.2 "NSAttributedStringKey" було перейменовано на "NSAttributedString.Key".
XLE_22

54

Стрімкий


Для зображення:

custom.tabBarItem = UITabBarItem(title: "Home", image: UIImage(named: "tab_icon_normal"), selectedImage: UIImage(named: "tab_icon_selected"))

Для тексту:

UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.gray], for: .normal)
    
UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], for: .selected)

48

Swift 4.2 та Xcode 10

Рішення, яке працювало для мене:

  1. Налаштування зображення - з набору розкадрувань Зображення елемента штрих-коду та вибраного зображення. Щоб видалити накладення відтінку на зображеннях, перейдіть до каталогу активів, виберіть зображення та змініть режим його візуалізації таким чином:

режим візуалізації зображення

Це заважатиме компоненту панелі вкладок встановлювати відтінок зображення за замовчуванням.

  1. Текст - тут я створив простий підклас UITabBarController і в його viewDidLoad методі я налаштував за замовчуванням і вибрав колір тексту таким:

    class HomeTabBarController: UITabBarController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let appearance = UITabBarItem.appearance(whenContainedInInstancesOf: [HomeTabBarController.self])
            appearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: .black], for: .normal)
            appearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: .red], for: .selected)
        }
    }
    

Просто встановіть цей клас як власний клас контролера панелі вкладок в інспекторі ідентифікації в IB.

Вуаля! Це воно.

Оновлення iOS 13 :

Додайте це до свого налаштування для iOS 13:

if #available(iOS 13, *) {
    let appearance = UITabBarAppearance()
    appearance.stackedLayoutAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: .red]
    tabBar.standardAppearance = appearance
}

Це має бути прийнятою відповіддю, якщо ви хочете зробити це за допомогою інспектора! Велике спасибі, це вирішило мою проблему
Емануель Амігуїньо

Дякую, ваше оновлення iOS 13 мені справді допомогло. У мене виникла дивна помилка, коли вибраний колір тексту елемента був правильним, коли панель вкладок була створена спочатку, але після того, як панель вкладок буде прихована і з’явиться знову (наприклад, представлення модального режиму на весь екран, а потім його відхилення), зміна вкладок призведе до скидання кольору тексту вибраного елемента до відтінковий колір. Додавши налаштування iOS 13, це виправлено.
Саул

16

Стрімкий 3

Це спрацювало для мене (посилаючись на встановлені кольори зображення tabBarItems):

UITabBar.appearance().tintColor = ThemeColor.Blue

if let items = tabBarController.tabBar.items {
        let tabBarImages = getTabBarImages() // tabBarImages: [UIImage]
        for i in 0..<items.count {
            let tabBarItem = items[i]
            let tabBarImage = tabBarImages[i]
            tabBarItem.image = tabBarImage.withRenderingMode(.alwaysOriginal)
            tabBarItem.selectedImage = tabBarImage
        }
    }

Я помітив, що якщо ви встановите зображення з режимом відтворення = .alwaysOriginal, UITabBar.tintColor не матиме жодного ефекту.



12

Стрімкий 3

Перш за все, переконайтеся, що ви додали клавішу BOOLEAN "Перегляд зовнішнього вигляду рядка стану на основі контролера" до Info.plist і встановіть значення "НІ".

Appdelegate.swift

Вставити код десь після "launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {"

  1. Змініть колір самої панелі вкладок за значенням кольору RGB:

UITabBar.appearance().barTintColor = UIColor(red: 0.145, green: 0.592, blue: 0.804, alpha: 1.00)

АБО один із кольорів інтерфейсу за замовчуванням:

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


  1. Змінення кольору тексту елементів вкладок:

Обраний елемент

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.white], for: .selected)

Неактивні елементи

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.black], for: .normal)

  1. Щоб змінити колір зображення, я вважаю, що найпростішим підходом є створення окремих зображень, по одному для кожного стану.

Якщо ви не робите піктограми з нуля, чергуючи чорно-білі версії порівняно легко зробити у Photoshop.


Adobe Photoshop (підійде майже будь-яка версія)

Переконайтесь, що зображення вашого піктограми має прозорий фон, а сама піктограма - суцільно чорна (або закрита).

Відкрийте файл зображення, збережіть його під іншим ім'ям файлу (наприклад exampleFilename-Inverted.png)

У підменю "Налаштування" меню "Зображення":

Натисніть "Інвертувати"

Тепер у вас є мінус оригінальної піктограми.

У XCode встановіть одне із зображень як «Вибране зображення» в розділі «Властивості панелі вкладок» на вашій розкадровці та вкажіть «неактивну» версію під зображенням «Елемент панелі».

Та-Да 🍺


Для вашого 3-го балу ви можете змінити його, не використовуючи фотошоп як:UITabBar.appearance().tintColor = UIColor.black
Чаудрі Талха

@ChaudhryTalha, відтінок працює для вибраного стану значка на панелі вкладок. Але для вибраного кольору піктограми стану (на <iOS10) чи існує подібна властивість, яку можна змінити?
anoo_radha

10

Спробуйте додати його на AppDelegate.swift (усередині методу програми ):

UITabBar.appearance().tintColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0)

// For WHITE color: 
UITabBar.appearance().tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

Приклад:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Tab bar icon selected color
    UITabBar.appearance().tintColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0)
    // For WHITE color: UITabBar.appearance().tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)
    return true
}

Приклад:

введіть тут опис зображення

введіть тут опис зображення

Моя англійська така погана! Вибачте! :-)


10

Я знаю, що тут багато відповідей, але я не можу знайти просту і дійсну відповідь на копіювання / вставлення для Swift 4.2 / Swift 5.1

tabBarController?.tabBar.tintColor = UIColor.red
tabBarController?.tabBar.unselectedItemTintColor = UIColor.green

Або використовувати UITabBarItem.appearance()замістьtabBarController?.tabBar

Зображення мають бути UIImageRenderingModeAlwaysTemplate


4

Свіфт 3.0

Я створив файл класу на панелі вкладок і написав наступний код

В viewDidLoad:

self.tabBar.barTintColor = UIColor.white
self.tabBar.isTranslucent = true

let selectedColor   = UIColor.red
let unselectedColor = UIColor.cyan

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: unselectedColor,NSFontAttributeName: UIFont(name: "Gotham-Book", size: 10)!], for: .normal)
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: selectedColor,NSFontAttributeName: UIFont(name: "Gotham-Book", size: 10)!], for: .selected)

if let items = self.tabBar.items {
    for item in items {
        if let image = item.image {
            item.image = image.withRenderingMode( .alwaysOriginal )
            item.selectedImage = UIImage(named: "(Imagename)-a")?.withRenderingMode(.alwaysOriginal)
        }
    }
}

Після viewDidLoad:

   override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

   if(item.title! == "title")
   {
    item.selectedImage = UIImage(named: "(Imagname)-a")?.withRenderingMode(.alwaysOriginal)

    }
    if(item.title! == "title")
    {
        item.selectedImage = UIImage(named: "(Imagname)-a")?.withRenderingMode(.alwaysOriginal)

    }
    if(item.title! == "title")
    {
        item.selectedImage = UIImage(named: "(Imagname)-a")?.withRenderingMode(.alwaysOriginal)

    }
    if(item.title! == "title")
    {
        item.selectedImage = UIImage(named: "(Imagname)-a")?.withRenderingMode(.alwaysOriginal)

    }
    if(item.title! == "title")
    {
        item.selectedImage = UIImage(named: "(Imagname)-a")?.withRenderingMode(.alwaysOriginal)

    }

}

з огляду на те, що метод завантаження потрібно встановити вибране зображення, а інше зображення відображається за допомогою RenderingMode, а в методі делегування на панелі вкладок ви встановлюєте вибране зображення відповідно до заголовка


4

Для Swift 4.0 він тепер змінений як:

tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.gray], for: .normal)
tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.blue], for: .selected)

Вам не потрібно підкласувати UITabBarItem, якщо ваша вимога полягає лише у зміні кольору тексту. Просто помістіть вищевказаний код всередину функції вашого контролера перегляду viewDidLoad.

Для глобальних налаштувань змініть tabBarItemна UITabBarItem.appearance().


3

У Swift 4.2:

UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], for: .selected)

1
Я помістив його в AppDelegate, під додатком func Відмінно працює!
Стеффо Дімфельт

2

ви можете встановити tintColor UIBarItem:

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.magentaColor()], forState:.Normal)
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState:.Selected)

2

Ви також можете зробити таким чином:

override func viewWillLayoutSubviews() {  
  if let items = self.tabBar.items {
    for item in 0..<items.count {
      items[item].image = items[item].image?.withRenderingMode(.alwaysOriginal)
            items[item].selectedImage = items[item].selectedImage?.withRenderingMode(.alwaysTemplate)
    }

Необов’язково:

 UITabBar.appearance().tintColor = UIColor.red

Сподіваюся, це вам допоможе.


2

Рік: 2020 iOS 13.3

Скопіюйте наведені нижче коди в AppDelegate.swift -> func didFinishLaunchingWithOptions

//Set Tab bar text/item fonts and size
let fontAttributes = [NSAttributedString.Key.font: UIFont(name: "YourFontName", size: 12.0)!]
UITabBarItem.appearance().setTitleTextAttributes(fontAttributes, for: .normal)
//Set Tab bar text/item color
UITabBar.appearance().tintColor = UIColor.init(named: "YourColorName")

2

Цей код працює для Swift 4, якщо ви хочете змінити зображення Tab Bar Itemпри натисканні. Скопіюйте та вставте перший viewDidLoadметод, який потрапив у проект

   let arrayOfImageNameForSelectedState:[String] = ["Image1Color", "Image2Color","Image3Color"]
   let arrayOfImageNameForUnselectedState: [String] = ["Image1NoColor","Image2NoColor","Image3NoColor"]


    print(self.tabBarController?.tabBar.items?.count)

    if let count = self.tabBarController?.tabBar.items?.count {
        for i in 0...(count-1) {
            let imageNameForSelectedState   = arrayOfImageNameForSelectedState[i]
            print(imageNameForSelectedState)
            let imageNameForUnselectedState = arrayOfImageNameForUnselectedState[i]
            print(imageNameForUnselectedState)
            self.tabBarController?.tabBar.items?[i].selectedImage = UIImage(named: imageNameForSelectedState)?.withRenderingMode(.alwaysOriginal)
            self.tabBarController?.tabBar.items?[i].image = UIImage(named: imageNameForUnselectedState)?.withRenderingMode(.alwaysOriginal)
        }
    }

1

від сюди .

Кожен елемент на панелі вкладок має заголовок, вибране зображення, невиділене зображення та значення значка.

Використовуйте поле Відтінок зображення (selectedImageTintColor), щоб вказати колір відтінку елемента смужки, коли вибрано цю вкладку. За замовчуванням цей колір синій.


4
Посилання мертве (404)
Maximelc

1

Свіфт 5:

let homeTab = UITabBarItem(title: "Home", image: UIImage(named: "YOUR_IMAGE_NAME_FROM_ASSETS")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), tag: 1)

1

У Swift 5 ioS 13.2 все змінилося зі стилем TabBar, нижче код працює на 100%, перевірено.

Додайте наведений нижче код у свій клас UITabBarController .

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let appearance = UITabBarAppearance()
        appearance.backgroundColor = .white

        setTabBarItemColors(appearance.stackedLayoutAppearance)
        setTabBarItemColors(appearance.inlineLayoutAppearance)
        setTabBarItemColors(appearance.compactInlineLayoutAppearance)

        setTabBarItemBadgeAppearance(appearance.stackedLayoutAppearance)
        setTabBarItemBadgeAppearance(appearance.inlineLayoutAppearance)
        setTabBarItemBadgeAppearance(appearance.compactInlineLayoutAppearance)

        tabBar.standardAppearance = appearance
 }

@available(iOS 13.0, *)
private func setTabBarItemColors(_ itemAppearance: UITabBarItemAppearance) {
    itemAppearance.normal.iconColor = .lightGray
    itemAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.gray]

    itemAppearance.selected.iconColor = .white
    itemAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.orange]
}

@available(iOS 13.0, *)
private func setTabBarItemBadgeAppearance(_ itemAppearance: UITabBarItemAppearance) {
    //Adjust the badge position as well as set its color
    itemAppearance.normal.badgeBackgroundColor = .orange
    itemAppearance.normal.badgeTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
    itemAppearance.normal.badgePositionAdjustment = UIOffset(horizontal: 1, vertical: -1)
}

1

Свіфт 5.3

let vc = UIViewController()
vc.tabBarItem.title = "sample"
vc.tabBarItem.image = UIImage(imageLiteralResourceName: "image.png").withRenderingMode(.alwaysOriginal)
vc.tabBarItem.selectedImage = UIImage(imageLiteralResourceName: "image.png").withRenderingMode(.alwaysOriginal)
        
// for text displayed below the tabBar item
UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .selected)

0

Просто додайте нове посилання на UITabBarController до проекту. Далі створіть посилання на UITabBar у цьому контролері:

@IBOutlet weak var appTabBar: UITabBar!

У його viewDidLoad () просто додайте нижче колір тексту заголовка :

    appTabBar.tintColor = UIColor.scandidThemeColor()

Для зображення

    tabBarItem = UITabBarItem(title: "FirstTab", image: UIImage(named: "firstImage"), selectedImage: UIImage(named: "firstSelectedImage"))

0

Підкласуйте свій TabbarViewController і в ViewDidLoad поставте цей код:

 [UITabBarItem.appearance setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor darkGreyColorBT]} forState:UIControlStateNormal];
    [UITabBarItem.appearance setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor nightyDarkColorBT]} forState:UIControlStateSelected];

    self.tabBar.items[0].image  = [[UIImage imageNamed:@"ic-pack off@3x.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.tabBar.items[0].selectedImage  = [[UIImage imageNamed:@"ic-pack@3x.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.tabBar.items[1].image = [[UIImage imageNamed:@"ic-sleeptracker off@3x.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.tabBar.items[1].selectedImage  = [[UIImage imageNamed:@"ic-sleeptracker@3x.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.tabBar.items[2].image = [[UIImage imageNamed:@"ic-profile off@3x.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.tabBar.items[2].selectedImage  = [[UIImage imageNamed:@"ic-profile@3x.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

Це найпростіше робоче рішення, яке я маю

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.