Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to subclass UINavigationBar for a UINavigationController programmatically?

I'm using a custom drawRect function to draw on UINavigationBar across my application in iOS4, it doesn't use images, only CoreGraphics.

Since you can't implement drawRect in UINavigationBar category in iOS5, Apple is suggesting to subclass UINavigationBar.

How is it possible to replace the UINavigationBar with my subclass in UINavigationController (so it'll be compatible with iOS4 and iOS5) when the navigationBar property is read only?

@property(nonatomic, readonly) UINavigationBar *navigationBar

I'm not using XIBs in my application at all, so adding a UINavigationBar to a NIB and changing the class via InterfaceBuilder is not an option.

like image 222
romaonthego Avatar asked Jul 12 '11 22:07

romaonthego


3 Answers

In iOS 6 they added a new method to UINavigationController that is retractively available in iOS 5 as well:

- (id)initWithNavigationBarClass:(Class)navigationBarClass
                    toolbarClass:(Class)toolbarClass;

Now you can just pass your custom class when the navigation controller is instantiated.

like image 85
Javier Soto Avatar answered Oct 09 '22 06:10

Javier Soto


As of iOS6, this is now quite simple to accomplish without swizzling or messing with other classes by using UINavigationControllers method initWithNavigationBarClass:toolbarClass:

- (id)initWithNavigationBarClass:(Class)navigationBarClass 
                    toolbarClass:(Class)toolbarClass;

From the docs:

Initializes and returns a newly created navigation controller that uses your custom bar subclasses.

Answer updated for iOS6.

like image 42
memmons Avatar answered Oct 09 '22 07:10

memmons


The only supported way to do this in iOS 4 is to use the Interface Builder method. You don't have to use IB to do anything except set the UINavigationBar subclass (you can still do all of your view set up programmatically).

like image 5
Ross Kimes Avatar answered Oct 09 '22 05:10

Ross Kimes