user2681789
user2681789

Reputation: 905

Hiding tabBar showing black bar in Ios7

I am using this code to hide the TabBar:

self.tabBarController.tabBar.hidden=YES;

I am hiding tabBarController in my project.but it showing black bar in bottom of the view in Ios7.When i go back to the same view it is looking good.any help will be appreciated.

Upvotes: 37

Views: 22677

Answers (10)

Haroldo Gondim
Haroldo Gondim

Reputation: 7995

Set true the property hidesBottomBarWhenPushed in the controller to hide.

For hide, all your controllers put into prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}

Upvotes: 1

Will
Will

Reputation: 1696

One line Swift 3 answer.

Put the following in your UIViewController subclass:

    override var hidesBottomBarWhenPushed: Bool { get { return true }  set { self.hidesBottomBarWhenPushed = newValue }}

Upvotes: 1

SmileBot
SmileBot

Reputation: 19642

In addition to the other excellent suggestions the following suggestion might help someone out. Try setting your tabbar to hidden in awakeFromNib instead of later in the lifecycle. I found that the hidden tabbar was flashing black on segue and this fixed it for me.

- (void)awakeFromNib { [super awakeFromNib]; self.tabBarController.tabBar.hidden = YES; }

Upvotes: 0

CTiPKA
CTiPKA

Reputation: 2974

NOTE: It is solution for iOS6 and 7 only.

In iOS 7 to extend clickable area and hide black bar on place of hidden UITabBar you should enable 'Extend Edges - Under Opaque Bars' option for you UIViewController.

Extend Edges - Under Opaque Bars option

Or you can set this property programmatically:

[self setExtendedLayoutIncludesOpaqueBars:YES]

Here is example of code that hide or move TabBar for iOS 6/7:

UITabBarController *bar = [self tabBarController];
if ([self respondsToSelector:@selector(setExtendedLayoutIncludesOpaqueBars:)]) {
    //iOS 7 - hide by property
    NSLog(@"iOS 7");
    [self setExtendedLayoutIncludesOpaqueBars:YES];
    bar.tabBar.hidden = YES;
} else {
    //iOS 6 - move TabBar off screen
    NSLog(@"iOS 6");
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float height = screenRect.size.height;
    [self moveTabBarToPosition:height];
}

//Moving the tab bar and its subviews offscreen so that top is at position y
-(void)moveTabBarToPosition:(int)y {

    self.tabBarController.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.size.height);

    for(UIView *view in self.tabBarController.view.subviews) {
        if ([view isKindOfClass:[UITabBar class]]) {
            [view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)];
        } else {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)];
            view.backgroundColor = [UIColor blackColor];
        }
    }
}

Function to moving the Tab Bar offscreen got from this post.

Upvotes: 55

user289841
user289841

Reputation:

I had some trouble while using a UINavigationController:

Here's my solution that works for iOS 7 AND UINavigationControllers:

HeaderFile

@interface UITabBarController (HideTabBar)
- (void)setHideTabBar:(BOOL)hide animated:(BOOL)animated;
@end

Implementation

#import "UITabBarController+HideTabBar.h"

@implementation UITabBarController (HideTabBar)

- (void)setHideTabBar:(BOOL)hide animated:(BOOL)animated {
  UIViewController *selectedViewController = self.selectedViewController;
  /**
  * If the selectedViewController is a UINavigationController, get the visibleViewController.
  * - setEdgesForExtendedLayout won't work with the UINavigationBarController itself.
  * - setExtendedLayoutIncludesOpaqueBars won't work with the UINavigationBarController itself.
  */
  if ([selectedViewController isKindOfClass:[UINavigationController class]])
    selectedViewController = ((UINavigationController *)selectedViewController).visibleViewController;
  __weak __typeof(self) weakSelf = self;

  void (^animations)(void) = ^{
      selectedViewController.edgesForExtendedLayout = UIRectEdgeAll;
      [selectedViewController setExtendedLayoutIncludesOpaqueBars:hide];
      weakSelf.tabBar.hidden = hide;

      /**
      * Just in case we have a navigationController, call layoutSubviews in order to resize the selectedViewController
      */
      [selectedViewController.navigationController.view layoutSubviews];
  };

  [UIView animateWithDuration:animated ? UINavigationControllerHideShowBarDuration : 0 animations:animations];
}

@end

Thanks to Vadim Trulyaev for pointing out the Extend Edges - Under Opaque Bars flag!

Upvotes: 4

Tea
Tea

Reputation: 306

Try this:

- (BOOL)hidesBottomBarWhenPushed {
     return YES;
}

Upvotes: 13

maiconpeixinho
maiconpeixinho

Reputation: 191

Based on solution of @Vadim Trulyaev, i created a simple usage:

UITabBarController+HideTabBar.h

@interface UITabBarController (Additions)
- (void)setTabBarHidden:(BOOL)hidden myClass:(UIViewController *)myClass;
@end

UITabBarController+HideTabBar.m

#import "UITabBarController+HideTabBar.h"

@implementation UITabBarController (HideTabBar)

- (void)setTabBarHidden:(BOOL)hidden myClass:(UIViewController *)myClass{
    if ([myClass respondsToSelector:@selector(setExtendedLayoutIncludesOpaqueBars:)]) {
        //iOS 7 - hide by property
        NSLog(@"iOS 7");
        [myClass setExtendedLayoutIncludesOpaqueBars:hidden];
        self.tabBar.hidden = hidden;
    } else {
        //iOS 6 - move TabBar off screen
        NSLog(@"iOS 6");
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        float height = screenRect.size.height;
        if(hidden){
            [self moveTabBarToPosition:height];
        }else{
            [self moveTabBarToPosition:height - self.tabBar.frame.size.height];
        }
    }
}

//Moving the tab bar and its subviews offscreen so that top is at position y
-(void)moveTabBarToPosition:(int)y {
    self.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBar.frame.size.width, self.tabBar.frame.size.height);

    for(UIView *view in self.view.subviews) {
        if ([view isKindOfClass:[UITabBar class]]) {
            [view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)];
        } else {
            NSLog(@"%f",view.frame.size.height);
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)];
            NSLog(@"%f",view.frame.size.height);
            view.backgroundColor = [UIColor blackColor];
        }
    }
}

@end

How to use:

[[self tabBarController] setTabBarHidden:NO myClass:self];

BUT, in iOS6 i have some issue, when i go first time to ViewController1 where the tabbar is hidden everthing works fine, but if i go to a ViewController2 that show the tab bar and back to ViewController1 that the tab bar must be hidden, the black space show up. Anyone can help me?!

Thanks!

Upvotes: 0

Ben Flynn
Ben Flynn

Reputation: 18922

I spent a long time battling this, trying to place a responsive button at the bottom of table view. I am not using auto-layout. I found two main differences between iOS 6 and 7:

  1. On iOS7, when the tab bar is animated out, the view of the root view controller does not extend into the area where the tab bar was; it needs to be resized.

  2. On iOS7, only the view of type UITabBar needs to be animated off and on the screen.

A further issue with point 1 is that if, in iOS7, you extend a child view of your visible view controllers main view over the space left behind by the tab view, it won't be interactable unless the main view is extended as well. With that in mind, I used the following code:

Hide tab bar (reverse the math so show it):

[UIView animateWithDuration:kHideTabBarAnimationDuration animations:^{
    for(UIView *view in self.tabBarController.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y + view.frame.size.height, view.frame.size.width, view.frame.size.height)];
        }
        else
        {
            if (![MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height + self.tabBarController.tabBar.frame.size.height)];
            }
        }
    }
} completion:nil];

Adjust the main view when hiding tab bar:

// Expand view into the tab bar space
if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
    CGRect frame = self.view.frame;
    self.view.frame = CGRectMake(frame.origin.x,
                                 frame.origin.y,
                                 frame.size.width,
                                 frame.size.height + tabBarHeight);
}

Adjust the main view when revealing tab bar:

[UIView animateWithDuration:kHideTabBarAnimationDuration delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
    // Create space for the tab bar            
    if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
    {
        CGRect frame = self.view.frame;
        self.view.frame = CGRectMake(frame.origin.x,
                                     frame.origin.y,
                                     frame.size.width,
                                     frame.size.height - tabBarHeight);
    }
} completion:nil];

Note that I don't animate the main view expansion when hiding the tab bar, this looks natural since the expansion happens behind the tab bar.

Also note

In iOS 7, if you rotate from portrait to landscape while the tab bar is hidden, the black box reappears. I solved this by animating the tab bar back onto the screen before the rotation animation (which was good enough for what I'm working on).

Upvotes: 0

PSsam
PSsam

Reputation: 649

Next code works for me

- (void)showTabBar {
[self.tabBar setTranslucent:NO];
[self.tabBar setHidden:NO];
}

- (void)hideTabBar {
    [self.tabBar setTranslucent:YES];
    [self.tabBar setHidden:YES];
}

Upvotes: 20

user2681789
user2681789

Reputation: 905

To showTabbar:

- (void)showTabBar:(UITabBarController *) tabbarcontroller
    {
            //[UIView beginAnimations:nil context:NULL];
            //[UIView setAnimationDuration:0.5];
        for(UIView *view in tabbarcontroller.view.subviews)
                {


            if([view isKindOfClass:[UITabBar class]])
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, 521, view.frame.size.width, view.frame.size.height)];

                    }
            else
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 521)];
                    }
                }

            // [UIView commitAnimations];
    }

To hide Tabbar:
 - (void)hideTabBar:(UITabBarController *) tabbarcontroller
    {
            //[UIView beginAnimations:nil context:NULL];
            //[UIView setAnimationDuration:0.5];

        for(UIView *view in tabbarcontroller.view.subviews)
                {
            if([view isKindOfClass:[UITabBar class]])
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, 568, view.frame.size.width, view.frame.size.height)];
                    }
            else
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 568)];
                    }
                }

            //[UIView commitAnimations];
    }

Upvotes: 0

Related Questions