iOS隐藏tabbar

作者: sovran | 来源:发表于2018-10-09 17:34 被阅读0次

一般如果要从带tabbar的页面跳转到某个页面,只需要用到hidesBottomBarWhenPushed 就可以了,代码如下

- (void)next {
    
    UIViewController *n = [UIViewController new];
    n.view.backgroundColor = [UIColor whiteColor];
    n.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:n animated:YES];
}

但如果要在包含tabbar的页面中,动态的控制tabbar的隐藏状态可以使用如下代码

- (void)hideTabbar:(BOOL)hide {
    
    // 内嵌页面 不操作tabbar
    if (![self.parentViewController isKindOfClass:[UINavigationController class]]) {
        return;
    }
    
    // 二级页面 不操作tabbar
    if (![self isEqual:self.navigationController.viewControllers[0]]) {
        return;
    }
    
    self.isTabbarHidden = hide; // isTabbarHidden 用来保存当前tabbar的隐藏状态
    self.tabBarController.tabBar.hidden = hide;
    self.hidesBottomBarWhenPushed = hide; // 设置这个主要是用于tab间切换,切换回来的时候,保持当前页面tabbar状态不变
    
    // 调整view的大小
    UIView *tab = self.tabBarController.view;
    if (hide) {
        self.view.frame = tab.bounds;
        self.hideTabbarBefore = true;
    } else {
        self.view.frame = CGRectMake(tab.bounds.origin.x, tab.bounds.origin.y, tab.bounds.size.width, tab.bounds.size.height - self.tabBarController.tabBar.frame.size.height);
    }
}

这里有一个问题,操作如下

  1. 隐藏tabbar后,然后push到一个新页面。
  2. 返回第一个页面, 显示tabbar
  3. 然后再push到一个新页面, 这个时候tabbar不会被隐藏。

我的解决方案, 在willDisappear的时候 判断是否是push,如果是push,又刚刚tabbar被隐藏过,那么就手动隐藏tabbar。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ([self isEqual:self.navigationController.viewControllers[0]]) {
        // 切tab的时候需要还原tabbar状态为显示
        if (self.controller.navigationController.viewControllers.count == 1) {
              // 不是present新页面
              if (!self.controller.presentedViewController) {
                  [self.controller.tabBarController.tabBar setHidden:NO];
              }
          } else {
              // 上一次被hidden过了, 这次需要手动隐藏tabbar,否则tabbar不会隐藏,设置了hidesBottomWhenPush也没用
              if (_hideTabbarBefore) {
                  self.controller.tabBarController.tabBar.hidden = YES;
                  _hideTabbarBefore = NO;
              }
          }
    }
}

差不多这样子了。

相关文章

网友评论

    本文标题:iOS隐藏tabbar

    本文链接:https://www.haomeiwen.com/subject/zzryaftx.html