37

我正在使用此代码来隐藏 TabBar:

self.tabBarController.tabBar.hidden=YES;

我在我的项目中隐藏了 tabBarController。但它在 Ios7 的视图底部显示黑条。当我回到同一个视图时,它看起来不错。任何帮助将不胜感激。

4

10 回答 10

55

注意:它仅适用于 iOS6 和 7。

在 iOS 7 中,要扩展可点击区域并在隐藏的 UITabBar 的位置隐藏黑条,您应该为 UIViewController 启用“扩展边缘 - 在不透明条下”选项。

延伸边线 - 在不透明条下选项

或者您可以通过编程方式设置此属性:

[self setExtendedLayoutIncludesOpaqueBars:YES]

下面是隐藏或移动 iOS 6/7 的 TabBar 的代码示例:

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];
        }
    }
}

将标签栏移出屏幕的功能来自这篇文章

于 2013-10-29T12:53:03.240 回答
20

下一个代码对我有用

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

- (void)hideTabBar {
    [self.tabBar setTranslucent:YES];
    [self.tabBar setHidden:YES];
}
于 2013-10-31T15:18:25.987 回答
13

尝试这个:

- (BOOL)hidesBottomBarWhenPushed {
     return YES;
}
于 2014-03-19T15:31:47.383 回答
4

我在使用 UINavigationController 时遇到了一些麻烦:

这是适用于 iOS 7 和 UINavigationControllers 的解决方案:

头文件

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

执行

#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

感谢Vadim Trulyaev指出“ Extend Edges - Under Opaque Bars”标志!

于 2014-04-03T10:19:16.877 回答
1

一行 Swift 3 答案。

将以下内容放入您的 UIViewController 子类中:

    override var hidesBottomBarWhenPushed: Bool { get { return true }  set { self.hidesBottomBarWhenPushed = newValue }}
于 2017-08-29T16:34:32.223 回答
1

将控制器中true的属性设置hidesBottomBarWhenPushed为隐藏。

对于隐藏,您所有的控制器都放入prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}
于 2019-08-14T01:56:45.010 回答
0

我花了很长时间来解决这个问题,试图在表格视图的底部放置一个响应按钮。我没有使用自动布局。我发现 iOS 6 和 7 之间有两个主要区别:

  1. 在 iOS7 上,当 tab bar 动画出来时,root view controller 的 view 不会延伸到 tab bar 所在的区域;它需要调整大小。

  2. 在 iOS7 上,只有 UITabBar 类型的视图需要在屏幕上进行动画关闭和显示。

第 1 点的另一个问题是,如果在 iOS7 中,您将可见视图控制器主视图的子视图扩展到选项卡视图留下的空间,除非主视图也被扩展,否则它将无法交互。考虑到这一点,我使用了以下代码:

隐藏标签栏(反转数学所以显示它):

[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];

隐藏标签栏时调整主视图:

// 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);
}

显示标签栏时调整主视图:

[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];

请注意,隐藏标签栏时我不会为主视图扩展设置动画,这看起来很自然,因为扩展发生在标签栏后面。

另请注意

在 iOS 7 中,如果您在标签栏隐藏的情况下从纵向旋转到横向,则会再次出现黑框。我通过在旋转动画之前将标签栏动画化回到屏幕上解决了这个问题(这对于我正在处理的工作来说已经足够好了)。

于 2014-02-04T17:12:53.107 回答
0
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];
    }
于 2013-10-12T04:58:01.643 回答
0

基于@Vadim Trulyaev 的解决方案,我创建了一个简单的用法:

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

如何使用:

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

但是,在 iOS6 中我有一些问题,当我第一次去 ViewController1 隐藏标签栏时一切正常,但是如果我去一个显示标签栏的 ViewController2 并返回到 ViewController1 必须隐藏标签栏,黑色空间出现。任何人都可以帮助我?!

谢谢!

于 2014-03-18T23:37:17.457 回答
0

除了其他出色的建议之外,以下建议可能会对某人有所帮助。尝试将标签栏设置为隐藏在 awakeFromNib 中,而不是在生命周期的后期。我发现隐藏的标签栏在 segue 上闪烁黑色,这为我修复了它。

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

于 2015-04-06T18:25:15.760 回答