Search code examples
iphoneiosxcodetoolbarshow-hide

iPhone : Hiding / showing Toolbar


I have a toolbar on top of my view with a back button. I would like when the view loads to appear with the toolbar hidden and then, with a touch of the button to appear animated.

--Edit-- I am not using a Navigation Controller.


Solution

  • Given new information - that there's no UINavigationController - things are different. Here are the relevant bits from my code...

    Create the nav bar and add it to your view:

    // Create the navigation bar
    
    self.navBar = [[UINavigationBar alloc] init];
    [self.view addSubview:self.navBar];
    

    Lay it out..

    - (CGRect)frameForOrientation:(UIInterfaceOrientation)theOrientation
    {
        UIScreen *screen = [UIScreen mainScreen];
        CGRect fullScreenRect = screen.bounds;      // always implicitly in Portrait orientation.
        CGRect appFrame = screen.applicationFrame;
    
        // Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds.
        // Little bit ugly looking, but it'll still work even if they change the status bar height in future.
        float statusBarHeight = MAX((fullScreenRect.size.width - appFrame.size.width), (fullScreenRect.size.height - appFrame.size.height));
    
        // Initially assume portrait orientation.
        float width = fullScreenRect.size.width;
        float height = fullScreenRect.size.height;
    
        // Correct for orientation.
        if (UIInterfaceOrientationIsLandscape(theOrientation)) {
            width = fullScreenRect.size.height;
            height = fullScreenRect.size.width;
        }
    
        // Account for status bar, which always subtracts from the height (since it's always at the top of the screen).
        height -= statusBarHeight;
    
        return CGRectMake(0, statusBarHeight, width, height);
    }
    
    - (CGSize)viewSizeForOrientation:(UIInterfaceOrientation)theOrientation
    {
        CGRect frame = [self frameForOrientation:theOrientation];
        return CGSizeMake(frame.size.width, frame.size.height);
    }
    
    - (void)layoutSubviewsForInterfaceOrientation:(UIInterfaceOrientation)theOrientation withAnimation:(BOOL)animate
    {
        CGSize fullSize = [self viewSizeForOrientation:theOrientation];
        float width = fullSize.width;
        float height = fullSize.height;
    
        CGRect newFrame = CGRectMake(0, 0, width, height);
        SubViewController *controller;
        UIView *theView;
    
        // Place the navigation bar
    
        CGRect navBarFrame = newFrame;
        navBarFrame.size.height = NAVBARHEIGHT;
        self.navBar.frame = navBarFrame;
    }
    

    Create a function to who it/hide it:

    - (void)showNavigationBar:(BOOL)show
    {
        if (show == YES && self.navBar.hidden == YES) {
    
            // Move the frame out of sight
            CGRect frame = self.navBar.frame;
            frame.origin.y = -frame.size.height;
            self.navBar.frame = frame;
    
            // Display it nicely
            self.navBar.hidden = NO;
            frame.origin.y = 0.0;
            [self.view bringSubviewToFront:self.navBar];
    
            [UIView animateWithDuration:0.3
                             animations:^(void) {
                                 self.navBar.frame = frame;
                             }
             ];
        }
        else if (show == NO && self.navBar.hidden == NO) {
    
            CGRect frame = self.navBar.frame;
    
            // Display it nicely
            frame.origin.y = -frame.size.height;
            [self.view bringSubviewToFront:self.navBar];
    
            [UIView animateWithDuration:0.3
                             animations:^(void) {
                                 self.navBar.frame = frame;
                             }
                             completion:^(BOOL finished) {
                                 self.navBar.hidden = YES;
                             }
             ];
        }
    }
    

    where

    #define NAVBARHEIGHT 44