1. 程式人生 > >IOS中如何在多層介面之間顯示與隱藏標籤欄(UITabBar)

IOS中如何在多層介面之間顯示與隱藏標籤欄(UITabBar)

在做專案的時候,遇到了一個難題,使用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;
}