UINavigationBar меняет цвет оттенка в категории

Я знаю, что могу легко изменить оттенок панели навигации в файле xib. Но проблема в том, что если мне придется переодеться во многих местах.

Поэтому я попытался использовать (причудливую) категорию и переопределить метод рисования прямоугольника.

#import "UINavigationBar+customTint.h"

@implementation UINavigationBar (customTint)

-(void)drawRect:(CGRect)rect{
    self.tintColor = [UIColor redColor];
}

@end

Я также импортировал его в соответствующий контроллер представления. Что я делаю неправильно? Как правильно это сделать?

Заранее спасибо


person Neelesh    schedule 16.02.2012    source источник
comment
см. этот URL-адрес stackoverflow.com/questions/9206116/   -  person Deepesh    schedule 16.02.2012


Ответы (2)


Это один из способов сделать это. Вероятно, вам будет проще ViewController везде, где вам нужно изменить его, добавьте строку:

self.navigationController.navigationBar.tintColor = [UIColor redColor];

Использование категории только для одной строки, вероятно, излишне.

РЕДАКТИРОВАТЬ: Если вы хотите использовать категорию, вам может потребоваться вызвать setNeedsDisplay на панели навигации. или переопределить другой метод и вызвать его. Что-то типа ,

[self.navigationController.navigationBar setNeedsDisplay];

Также согласно документации Apple

В iOS 5 реализации UINavigationBar, UIToolbar и UITabBar изменились, так что метод drawRect: не вызывается, если он не реализован в подклассе. Приложения, которые повторно реализовали drawRect: в категории любого из этих классов, обнаружат, что метод drawRect: не вызывается. UIKit выполняет проверку ссылок, чтобы предотвратить вызов метода в приложениях, связанных до iOS 5, но не поддерживает этот дизайн в iOS 5 или более поздних версиях. Приложения могут:

  • Используйте API настройки для баров в iOS 5 и более поздних версиях, что является предпочтительным способом.
  • Подкласс UINavigationBar (или другие классы панелей) и переопределить drawRect: в подклассе.

Поэтому лучший способ сделать это — поместить это в свой ApplicationDidFinishLaunching

NSString *reqSysVer = @"5.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
  [[UINavigationBar appearance] setTintColor:myColor];

А также оставьте свой DrawRect, чтобы работало на iOS меньше 5

person Amit Shah    schedule 16.02.2012
comment
Учтите, что мне нужно изменить в 3-х разных местах, и когда все будет готово, графический дизайнер попросит меня изменить это. Затем мне нужно снова измениться в 3-х местах. - person Neelesh; 16.02.2012
comment
Не имеет значения, вы можете поместить этот код в 3 разных местах или столько раз, сколько захотите. Просто измените цвет на то, что вы хотите. - person Amit Shah; 16.02.2012
comment
у меня вопрос как поменять его в одном общем месте? - person Neelesh; 16.02.2012
comment
Обратите внимание, что переопределение drawRect: может повлиять на производительность. - person ikuramedia; 16.02.2012
comment
Затем мне снова приходится менять местами в 3-х местах. Один из подходов состоит в том, чтобы поместить весь этот глобальный материал в #define, в один файл (например, constants.h), который вы #импортируете из каждого файла контроллера представления, тогда вам нужно изменить его только в одном месте. - person Peter Johnson; 12.06.2013

Если вы используете iOS5, то правильный способ сделать это — использовать прокси-сервер UIAppearance.

[[UINavigationBar appearance] setTintColor:myColor];

Подробности здесь: https://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html

person ikuramedia    schedule 16.02.2012
comment
Это необходимо только один раз и повлияет на все UINavigationBars, вы можете вызвать это из applicationDidFinishLaunching. - person ikuramedia; 16.02.2012
comment
но это только для iOS 5? Как насчет предыдущих версий iOS - person Neelesh; 16.02.2012
comment
То же, что и ответ @Amit Shah - вам нужно перебрать все UINavigationBars. Один из способов сделать это — создать Singleton, который возвращает предпочтительный цвет оттенка, и использовать его при инициализации UINavigationBar — тогда вам нужно изменить его только в одном месте, когда дизайнер решит, что ему нужно на 1% больше красного, или нашел новую страницу в каталоге Pantone... - person ikuramedia; 16.02.2012