iOS: Positioning navigation bar buttons within custom navigation bar

I’m building an app with a custom navigation bar. After some research I decided to do this using a category on UINavigationBar. The navigation bar needs to be a bit larger than usual to accomodate a drop shadow. Here is the code:

#import "UINavigationBar+CustomWithShadow.h"

@implementation UINavigationBar (CustomWithShadow)

- (void)drawRect:(CGRect)rect {

    // Change the tint color in order to change color of buttons
    UIColor *color = [UIColor colorWithHue:0.0 saturation:0.0 brightness:0.0 alpha:0.0];
    self.tintColor = color;

    // Add a custom background image to the navigation bar 
    UIImage *image = [UIImage imageNamed:@"NavBar.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, 60)];

- (void)layoutSubviews {

    self.frame = CGRectMake(0, 20, self.frame.size.width, 60);

The only problem now is that the larger navigation bar means that the navigation bar buttons end up too far down, like so:

  • NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController
  • Force Rotate UIViewController
  • Obj-C, Navigation Controller with Tab Controller am I using them incorrectly?
  • Pushing a navigation controller is not supported error message
  • How to make Segue animation Horizontal without UINavigationController?
  • Embedding a navigation controller in a container - Objective C
  • enter image description here

    Does anyone know how I can correct the position of the buttons?

    Thanks for all help!


    I add the buttons to the nav bar in the init method of the view controller like so:

    // Create "Add" button for the nav bar
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] 
    [[self navigationItem] setRightBarButtonItem:addButton];
    [addButton release];

    3 Solutions Collect From Internet About “iOS: Positioning navigation bar buttons within custom navigation bar”

    You’ll need to add the leftBarButtonItem and rightBarButtonItem as custom items and mess with the frames…. for example:

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0,5,buttonImage.size.width,buttonImage.size.height)];
    [button setBackgroundImage:buttonImage forState:UIControlStateNormal];
    [button addTarget:delegate action:@selector(barButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:titleString forState:UIControlStateNormal];
    [button setTitleColor:CUSTOM_BAR_BUTTON_TITLE_COLOR forState:UIControlStateNormal];
    [[button titleLabel] setFont:[UIFont boldSystemFontOfSize:14]];
    [[button titleLabel] setShadowColor:CUSTOM_BAR_BUTTON_SHADOW_COLOR];
    [[button titleLabel] setShadowOffset:CGSizeMake(0,-1)];
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
    [button release];
    [[self navigationItem] setRightBarButtonItem:barButton];
    [barButton release];

    Try adding the buttons to the nav bar in the viewDidLoad method of the view controller instead.

    My solution, not the best, but it works for me fine. My custom navigation bar has height 55 (default height is 44). I cut from my custom navigation bar only 44 of height and insert it to the navigation bar. Then I cut next part of my custom navigation bar (shadows etc.) and insert it as image view under the navigation bar. And that’s it. Buttons are at right places…