Neelesh
Neelesh

Reputation: 3693

UINavigationBar change tint color in Category

I know I can change the tint color of navigation bar in xib file easily. But the problem is that if i have to change in a lot of places.

Hence i tried using the (fancy) category and overriding the draw rect method.

#import "UINavigationBar+customTint.h"

@implementation UINavigationBar (customTint)

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

@end

I have imported it in the corresponding view controller as well. What am i doing wrong? Whats the right way of doing it?

THanks in advance

Upvotes: 1

Views: 2739

Answers (2)

Amit Shah
Amit Shah

Reputation: 4164

That is one way of doing it. It would probably just be easier in you ViewController where ever you need to change it add the line:

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

Using a category for just one line is probably overkill.

EDIT: If you do want to use a category, you may need to call setNeedsDisplay on the navigation bar. or override another method and call it. Something like ,

[self.navigationController.navigationBar setNeedsDisplay];

Also according to Apple's documentation

In iOS 5, the UINavigationBar, UIToolbar, and UITabBar implementations have changed so that the drawRect: method is not called unless it is implemented in a subclass. Apps that have re-implemented drawRect: in a category on any of these classes will find that the drawRect: method isn't called. UIKit does link-checking to keep the method from being called in apps linked before iOS 5 but does not support this design on iOS 5 or later. Apps can either:

  • Use the customization API for bars in iOS 5 and later, which is the preferred way.
  • Subclass UINavigationBar (or the other bar classes) and override drawRect: in the subclass.

The best way to therefore go about this would be to place this in your ApplicationDidFinishLaunching

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

And also leave your DrawRect, so that it will work on iOS less than 5

Upvotes: 2

ikuramedia
ikuramedia

Reputation: 6058

If you're using iOS5 then the correct way to do it is to use the UIAppearance proxy.

[[UINavigationBar appearance] setTintColor:myColor];

Details here: https://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html

Upvotes: 2

Related Questions