一般如果要从带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);
}
}
这里有一个问题,操作如下
- 隐藏tabbar后,然后push到一个新页面。
- 返回第一个页面, 显示tabbar
- 然后再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;
}
}
}
}
差不多这样子了。