Iphone: Is it possible to hide the TabBar? (Pre-iOS 8)

后端 未结 16 1637
广开言路
广开言路 2020-12-05 04:23

I have an application that uses a UITabBarController to switch between modes. When in a certain mode, I\'d like to hide the tab bar until the steps of that mode

16条回答
  •  一向
    一向 (楼主)
    2020-12-05 05:21

    I had worked on almost the same case, actually used the code from http://www.developers-life.com/hide-uitabbarcontrolleruitabbar-with-animation.html and made it better according to my needs, this might help others too.

    I am using a UISplitViewController as the root view controller and its detail portion is a UITabBarController, I had to hide the tabbar in portrait mode:

    // In UITabBarController's custom implementation add following method, 
    // this method is all that will do the trick, just call this method 
    // whenever tabbar needs to be hidden/shown 
    - (void) hidetabbar:(NSNumber*)isHidden {
        UITabBarController *tabBarController=self;
    
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
    
        CGRect tabbarFrame=CGRectZero;
        for(UIView *theView in tabBarController.view.subviews) {
            //NSLog(@"%@", view);
            if([theView isKindOfClass:[UITabBar class]]) {
                tabbarFrame=theView.frame;
                if ([isHidden boolValue]) {
                    tabbarFrame=CGRectMake(tabbarFrame.origin.x, 
                                           tabBarController.view.frame.size.height, 
                                           tabbarFrame.size.width, 
                                           tabbarFrame.size.height);
                } else {
                    tabbarFrame=CGRectMake(tabbarFrame.origin.x, 
                                           tabBarController.view.frame.size.height - tabbarFrame.size.height, 
                                           tabbarFrame.size.width,
                                           tabbarFrame.size.height);
                }
                theView.frame=tabbarFrame;
                break;
            }
        }
    
        for(UIView *theView in tabBarController.view.subviews) {
            if(![theView isKindOfClass:[UITabBar class]]) {
                CGRect theViewFrame=theView.frame;
                if ([isHidden boolValue]) {
                    theViewFrame=CGRectMake(theViewFrame.origin.x, 
                                            theViewFrame.origin.y, 
                                            theViewFrame.size.width, 
                                            theViewFrame.size.height + tabbarFrame.size.height);
                } else {
                    theViewFrame=CGRectMake(theViewFrame.origin.x, 
                                            theViewFrame.origin.y, 
                                            theViewFrame.size.width, 
                                            theViewFrame.size.height - tabbarFrame.size.height);
                }
                theView.frame=theViewFrame;
            }
        }
        [UIView commitAnimations];
    }
    

    I used following code to call the hidetabbar: method

    //In my UISplitViewController's custom implementation
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        @synchronized(self){
        //change the self.splitDetailController to your UITabBarController's object
        [self.splitDetailController 
         performSelector:@selector(hidetabbar:) 
         withObject:[NSNumber numberWithBool:UIInterfaceOrientationIsLandscape(interfaceOrientation)]
         afterDelay:0.5];
        }
        return YES;
    }
    

    I tested this code to work in simulator only, let me know if it works on device too ;-)

提交回复
热议问题