简体   繁体   English

隐藏tabBar显示Ios7中的黑条

[英]Hiding tabBar showing black bar in Ios7

I am using this code to hide the TabBar: 我正在使用此代码隐藏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. 我在我的项目中隐藏了tabBarController。但它在Ios7的视图底部显示了黑条。当我回到相同的视图时它看起来很好。任何帮助将不胜感激。

NOTE: It is solution for iOS6 and 7 only. 注意:它仅适用于iOS6和7。

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. 在iOS 7中,为了扩展可点击区域并在隐藏的UITabBar上隐藏黑条,你应该为你的UIViewController启用'Extend Edges - Under Opaque Bars'选项。

扩展边缘 - 在不透明条形下选项

Or you can set this property programmatically: 或者您可以以编程方式设置此属性:

[self setExtendedLayoutIncludesOpaqueBars:YES] [self setExtendedLayoutIncludesOpaqueBars:YES]

Here is example of code that hide or move TabBar for iOS 6/7: 以下是隐藏或移动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 . 这篇文章中获取移动Tab Bar的功能。

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

Try this: 尝试这个:

- (BOOL)hidesBottomBarWhenPushed {
     return YES;
}

I had some trouble while using a UINavigationController: 使用UINavigationController时遇到了一些麻烦:

Here's my solution that works for iOS 7 AND UINavigationControllers: 这是我的解决方案适用于iOS 7和UINavigationControllers:

HeaderFile 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! 感谢Vadim Trulyaev指出Extend Edges - Under Opaque Bars旗帜!

One line Swift 3 answer. 一行Swift 3回答。

Put the following in your UIViewController subclass: 将以下内容放在UIViewController子类中:

    override var hidesBottomBarWhenPushed: Bool { get { return true }  set { self.hidesBottomBarWhenPushed = newValue }}
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];
    }

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: 我发现iOS 6和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; 在iOS7上,当标签栏被动画化时,根视图控制器的视图不会延伸到标签栏所在的区域; it needs to be resized. 它需要调整大小。

  2. On iOS7, only the view of type UITabBar needs to be animated off and on the screen. 在iOS7上,只需要在屏幕上关闭UITabBar类型的视图。

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. 第1点的另一个问题是,如果在iOS7中,您可以在选项卡视图留下的空间上扩展可见视图控制器主视图的子视图,除非主视图也被扩展,否则它将无法进行交互。 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. 在iOS 7中,如果在隐藏标签栏时从纵向旋转到横向,则会再次出现黑框。 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). 我通过在旋转动画之前将标签栏设置回屏幕来解决这个问题(这对于我正在处理的事情已经足够了)。

Based on solution of @Vadim Trulyaev, i created a simple usage: 基于@Vadim Trulyaev的解决方案,我创建了一个简单的用法:

UITabBarController+HideTabBar.h 的UITabBarController + HideTabBar.h

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

UITabBarController+HideTabBar.m 的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. 但是,在iOS6中我有一些问题,当我第一次去ViewController1时,tabbar被隐藏everthing工作正常,但如果我去ViewController2显示标签栏并返回ViewController1,标签栏必须隐藏,黑色空间出现。 Anyone can help me?! 有人可以帮帮我吗?!

Thanks! 谢谢!

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. 尝试将标签栏设置为隐藏在awakeFromNib中,而不是在生命周期的后期。 I found that the hidden tabbar was flashing black on segue and this fixed it for me. 我发现隐藏的tabbar在segue上闪烁着黑色,这为我修复了它。

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

Set true the property hidesBottomBarWhenPushed in the controller to hide. 在控制器中设置true属性hidesBottomBarWhenPushed以隐藏。

For hide, all your controllers put into prepare for segue 对于隐藏,所有控制器都prepare for segue

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM