romaonthego romaonthego - 1 year ago 225
iOS Question

How to subclass UINavigationBar for a UINavigationController programatically?

I'm using a custom drawRect function to draw on

across my application in iOS4, it doesn't use images, only CoreGraphics.

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

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

@property(nonatomic, readonly) UINavigationBar *navigationBar

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

Answer Source

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 

From the docs:

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

Answer updated for iOS6.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download