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.
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.
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.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With