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

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

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

#import "UINavigationBar+customTint.h"

@implementation UINavigationBar (customTint)

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

@end

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

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

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

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

[[UINavigationBar appearance] setTintColor:myColor];

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

Другие вопросы по тегам