IOS中如何在多层界面之间显示与隐藏标签栏(UITabBar)

本文介绍了在iOS开发中遇到的一个问题:如何在多层界面之间灵活显示和隐藏TabBar。常规方法如设置`hidesBottomWhenPushed=YES`无法满足特定层级显示TabBar的需求。通过尝试手动隐藏和修改TabBar的Frame,最终找到了一种有效解决方案,即在父类控制器中实现并提供给子类调用的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做项目的时候,遇到了一个难题,使用hidesBottomWhenPushed=YES属性设置,可以让本级界面及其以后界面都隐藏,但是根据项目

需求,在第4层是需要显示标签栏的。

于是想了很多的办法,每个要显示的push的界面前都加了hidesBottomWhenPushed=YES,要隐藏的push的界面都加了hidesBottomWhenPushed=NO,

但是一样不好使。

手动调用self.tabbarchontroller.tabbar.hiden = YES,这样写可以隐藏标签栏的项,但是上面有一层白色的空白视图占着,一样没有解决问题。

最后想到了修改标签栏的Frame的方法来解决,果真能行。


我把下面的代码写到了项目中所有视图控制器的父类中:(记得暴露出这两个方法,让子类调用)

#pragma mark - 隐藏TabbBar
- (void)hideTabbar {
  if (_originY + 49 == fabs(self.tabBarController.tabBar.frame.origin.y)) {
    return ;
  }
  for (UIView *v in [self.tabBarController.view subviews]) {
    if ([v isKindOfClass:[UITabBar class]]) {
      [UIView animateWithDuration:0.01 delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^(){
        
        CGRect frame = v.frame;
        frame.origin.y += 49.0f;
          v.frame = frame;
        NSLog(@"tabBar originY: %f", frame.origin.y);
      } completion:nil];
    } else {
      [UIView animateWithDuration:0.01 delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^(){
        
        CGRect frame = v.frame;
        frame.size.height += 49.0f;
        v.frame = frame;
        
      } completion:nil];
    }
  }
  return;
}

#pragma mark - 显示TabBar
- (void)showTabBar {
  if (_originY == fabs(self.tabBarController.tabBar.frame.origin.y)) {
    return ;
  }
  for (UIView *v in [self.tabBarController.view subviews]) {
    if ([v isKindOfClass:[UITabBar class]]) {
      [UIView animateWithDuration:0.01 delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^(){
        
        CGRect frame = v.frame;
        frame.origin.y -= 49.0f;
          v.frame = frame;
      } completion:nil];
    } else {
      [UIView animateWithDuration:0.01 delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^(){
        CGRect frame = v.frame;
        frame.size.height -= 49.0f;
        v.frame = frame;
      } completion:nil];
    }
  }
  return;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值