Как тонировать цвет фона UIBarButtonItem? - PullRequest
9 голосов
/ 18 июля 2010

У меня есть UIToolbar, который содержит 2 кнопки. Панель инструментов имеет оттенок:

toolbar.tintColor = [UIColor colorWithRed:(102.0/255.0) green:(20.0/255.0) blue:(11.0/255.0) alpha:1];

Как сделать так, чтобы кнопки имели одинаковый оттенок?

Ответы [ 7 ]

15 голосов
/ 28 мая 2011

Мне показалось, что это решение предпочтительнее перечисленных здесь: Tint UIButton и UIBarButtonItem . В отличие от принятого ответа, он позволяет изменять цвет UIBarButtonItems независимо от UINavigationBar.

В случае, если ссылка в будущем будет недоступна, суть в том, что вы создадите тонированный UISegmentedControl (с UISegmentedControlStyleBar) с одним сегментом, а затем создадите UIBarButtonItem, используя его в качестве пользовательского представления.

В iOS 5 UIBarButtonItem имеет свойство tintColor.

8 голосов
/ 18 июля 2010

Лучше всего установить tintColor ПОСЛЕ добавления к нему кнопок, как в iOS 4.0, он больше не обновляет кнопки, добавленные на панели после установки tintColor.

2 голосов
/ 06 апреля 2011

см. «Изменение цвета UINavigationBarButtons»

РЕДАКТИРОВАТЬ: я удаляю ссылку, потому что домен не работает ...

Текст из кеша Google:


Хорошо, вот еще один быстрый совет.«Как изменить цвет кнопки на панели инструментов». Конечно, это можно применить к любой панели инструментов, но я собираюсь продемонстрировать процедуру на панели UINavigationBar.

На приведенном выше изображении показана только парацвета.По правде говоря, вы можете сделать кнопку любого цвета, который вы хотите.Фантастика!Код действительно прост для этого.Первое, что мы хотим сделать, это открыть файл заголовка для любого объекта, который будет поворачивать кнопку навигационной панели другого цвета и объявить класс пересылки UINavigationButton.Вы можете получить этот класс, либо перебирая подпредставления UINavigationBar, читая имена классов его подпредставлений, либо создавая дамп класса UIKit, если у вас есть взломанное устройство.

Поместите следующую строку перед объявлением интерфейса:

@class UINavigationButton;

Теперь объявите новый метод в заголовке, который мы будем использовать для фактического изменения цвета кнопки.

- (void)changeNavigationButtonColorToColor:(UIColor *)newColor

Или что-то похожее на строку кода выше.

Теперь откройте файл реализации вашего объекта и реализуйте описанный выше метод.В любом месте вашего файла добавьте следующий метод:

- (void)changeNavigationButtonColorToColor:(UIColor *)newColor {
     for (UIView *view in self.navigationController.navigationBar.subviews) {
             NSLog(@"%@", [[view class] description]);
             if ([[[view class] description] isEqualToString:@"UINavigationButton"]) {
                     [(UINavigationButton *)view setTintColor:newColor];
             }
     }
   }

Как вы можете видеть выше, на самом деле это намного проще, чем кажется на первый взгляд.Сначала мы создадим цикл for для итерации по подпредставлениям UINavigationBar, используя NSFastEnumeration.Затем мы выводим имя класса подпредставления для дальнейшего использования.Если имя класса UINavigationButton, то у нас есть наше представление.Все, что мы делаем, это устанавливаем свойство tintColor, если UINavigationButton.

Вот и все, все готово!

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

Помните, что кнопка "Назад" и кнопка навигации не одно и то же.Вам придется отдельно раскрасить кнопку возврата.

И, как обычно, вот ссылка на образец приложения, демонстрирующий этот код: NavButtonColor.zip

2 голосов
/ 18 июля 2010

Нашел ответ в этом посте:

UIToolbar оттенок на iOS 4

1 голос
/ 17 августа 2011

UIBarButtonItems неотъемлемо отвечает setTintColor, хотя это не публичный API.

У меня есть пользовательский подкласс UINavigationBar, который запускает этот блок:

for (UIView *subview in self.subviews) {
    if ([subview respondsToSelector:@selector(setTintColor:)]) {
        [subview performSelector:@selector(setTintColor:) withObject:[UIColor redColor]];
    }
}

Очевидно, замените [UIColor redColor] выбранным вами цветом.

0 голосов
/ 13 февраля 2017

Swift3

UIBarButtonItem.appearance().tintColor = UIColor.green
0 голосов
/ 11 декабря 2015

Доступно в iOS 5.0 и более поздних версиях для UIBarButtonItem:

 - (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics

Кажется, это единственное текущее решение (IOS 9.0).tintColor теперь используется для цвета изображения.

...