You can also override the drawLayer:inContext:drawLayer:inContext: method in a UINavigationBarUINavigationBar category class. Inside the drawLayer:inContext:drawLayer:inContext: method, you can draw the background image you want to use.
- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context { if ([self isMemberOfClass:[UINavigationBar class]] == NO) { return; } UIImage *image = (self.frame.size.width > 320) ? [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait]; CGContextClip(context); CGContextTranslateCTM(context, 0, image.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); } And as a complete demo Xcode project on customizing the appearance of UINavigationBarUINavigationBar this and this might be helpful.