romaonthego romaonthego - 4 months ago 87
iOS Question

How to subclass UINavigationBar for a UINavigationController programatically?

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.

Answer

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.

Comments