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

Знам, че мога лесно да променя цвета на оттенъка на лентата за навигация във файла xib. Но проблемът е, че ако трябва да сменям на много места.

Затова се опитах да използвам категорията (fancy) и да отменя метода draw rect.

#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 места. Един подход е да поставите всички тези глобални неща в #defines, в един файл (напр. constants.h), който #импортирате от всеки файл на viewcontroller, след което трябва да го промените само на едно място. - 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