IOS中如何在多層介面之間顯示與隱藏標籤欄(UITabBar)
阿新 • • 發佈:2019-02-02
在做專案的時候,遇到了一個難題,使用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; }