Adding UIToolbar with two UIBarButtonItem to a UINavigationBar: poor UIToolbar and what about iPhone 4

13,326

There's no guarantee that UIToolbar draws seamlessly inside a UINavigationBar; this might be responsible for the white line you're seeing.

You might be able to subclass UIToolbar so that it doesn't draw (i.e. override -drawRect: to not do anything).

Share:
13,326
testing
Author by

testing

Updated on July 17, 2022

Comments

  • testing
    testing almost 2 years

    I'm following the second tip from here. In this tip two UIBarButtonItems are put together in a UIToolbar. Finally, the UIToolbar is added to the UINavigationBar. Now to my problems:

    1) A white line is on top of the UIToolbar. If I increase the size of the UIToolbar, the gradient is wrong. I'm using the following size for the UIToolbar:

        UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 90, 44.01)];
    

    How can I get rid of the white line? See here: alt text

    The problem is that there is a white instead of a grey line. If it would be grey, everything would be perfect.

    2) What about the difference of the display size of iPhone 3 and iPhone 4? Do I have to check which iPhone is used and then double the size?

    Edit:

    The buttons are created like in the following example I took from the above mentioned website:

    // create a toolbar to have two buttons in the right
    UIToolbar* tools = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 133, 44.01)];
    
    // create the array to hold the buttons, which then gets added to the toolbar
    NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3];
    
    // create a standard "add" button
    UIBarButtonItem* bi = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:NULL];
    bi.style = UIBarButtonItemStyleBordered;
    [buttons addObject:bi];
    [bi release];
    
    // create a spacer
    bi = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    [buttons addObject:bi];
    [bi release];
    
    // create a standard "refresh" button
    bi = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
    bi.style = UIBarButtonItemStyleBordered;
    [buttons addObject:bi];
    [bi release];
    
    // stick the buttons in the toolbar
    [tools setItems:buttons animated:NO];
    
    [buttons release];
    
    // and put the toolbar in the nav bar
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];
    [tools release];
    

    @ tc.:

    I tried to subclass UIToolbar.

    // MyToolbar.h
    
    #import <Foundation/Foundation.h>
    
    
    @interface MyToolbar : UIToolbar {
    
    }
    
    @end
    
    // MyToolbar.m
    
    #import "MyToolbar.h"
    
    
    @implementation MyToolbar
    
    - (void)drawRect:(CGRect)rect {
        // do nothing
    }
    
    - (id)initWithFrame:(CGRect)aRect {
        if ((self = [super initWithFrame:aRect])) {
            self.opaque = NO;
            self.backgroundColor = [UIColor clearColor];
            self.clearsContextBeforeDrawing = YES;      
        }
        return self;
    }
    
    @end
    
  • testing
    testing over 13 years
    Yes, I didn't used a UIView and I didn't add them as independent items. Instead, I'm creating a UIToolbar, create a array of buttons, add the buttons to the toolbar and finally add the toolbar to the navigation bar. See my edited question for details.
  • testing
    testing over 13 years
    The white line is only above my buttons because I put my buttons in a UIToolbar. Then I put this UIToolbar on the UINavigationBar. So the white line comes from the size/drawing of my UIToolbar. Yes, it does matter if 44.01 or 44. The height of 44.01 works pretty well (except of this white line). If I take 44 then I get more drawing artifacts. I can also take 50 for the height. Then the white line disappears, but the gradient is not the same as the navigation bar anymore. See my edited question for details about creating this artifact.
  • testing
    testing over 13 years
    I tried to subclass UIToolbar. Now I have a black background for my toolbar. Which functions I have to implement that I get the same gradient/style from the UINavigationBar.
  • tc.
    tc. over 13 years
    Hmmm. Try additionally setting self.opaque = NO, self.backgroundColor = [UIColor clearColor], and self.clearsContextBeforeDrawing = YES in initWithFrame: or initWithCoder: as appropriate.
  • testing
    testing over 13 years
    Now I have overridden initWithFrame: (see my edited question). This seems to work at first sight. I never subclassed a UI element before. Do I have to be aware of something (things which won't work or something like this)?
  • tc.
    tc. over 13 years
    You have to be aware of how UIToolbar does its drawing. It doesn't seem to be documented, so you pretty much have to guess. It might change in future OS releases. However, the UIToolbar docs don't tell you not to subclass it, so you're reasonably safe.