Iphone: Is it possible to hide the TabBar? (Pre-iOS 8)
Here's my code for that:
This is, of course, mucking with the goings on in the controller's view hierarchy. It could change/break. This uses defined APIs, so Apple won't care, but they won't care about breaking your code, either.
- (void)hideTabBar { UITabBar *tabBar = self.tabBarController.tabBar; UIView *parent = tabBar.superview; // UILayoutContainerView UIView *content = [parent.subviews objectAtIndex:0]; // UITransitionView UIView *window = parent.superview; [UIView animateWithDuration:0.5 animations:^{ CGRect tabFrame = tabBar.frame; tabFrame.origin.y = CGRectGetMaxY(window.bounds); tabBar.frame = tabFrame; content.frame = window.bounds; }]; // 1}- (void)showTabBar { UITabBar *tabBar = self.tabBarController.tabBar; UIView *parent = tabBar.superview; // UILayoutContainerView UIView *content = [parent.subviews objectAtIndex:0]; // UITransitionView UIView *window = parent.superview; [UIView animateWithDuration:0.5 animations:^{ CGRect tabFrame = tabBar.frame; tabFrame.origin.y = CGRectGetMaxY(window.bounds) - CGRectGetHeight(tabBar.frame); tabBar.frame = tabFrame; CGRect contentFrame = content.frame; contentFrame.size.height -= tabFrame.size.height; }]; // 2}
Edit: An anonymous user has suggested the following addition for 7.0 (i have not tested this, and could not say whether it is a workaround or an ideal implementation):
// 1. To Hide the black line in IOS7 only, this extra bit is requiredif (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [self.tabBarController.tabBar setTranslucent:YES];} // 2. For IOS 7 onlyif (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [self.tabBarController.tabBar setTranslucent:NO];}
Edit: Entirely untested in 8.x and likely lacking in some layouts.
Like Steve, I haven't found a clean way to do this (even though Apple Photopicker does something similar). Here is what I have done:
if (systemAction) { // Reveal tab bar back CGRect bounds = [[UIScreen mainScreen] bounds]; CGRect tabBarFrame = self.tabBarController.tabBar.frame; self.tabBarController.view.frame = CGRectMake(0,0,bounds.size.width,bounds.size.height); self.toolBar.hidden = YES; systemAction = NO; } else { //hide tab bar CGRect bounds = [[UIScreen mainScreen] bounds]; CGRect tabBarFrame = self.tabBarController.tabBar.frame; CGRect navigationBarFrame = self.navigationController.navigationBar.frame; self.tabBarController.view.frame = CGRectMake(0,0,bounds.size.width,bounds.size.height+tabBarFrame.size.height); self.toolBar.hidden = NO; CGRect frame = self.toolBar.frame; frame.origin.y = bounds.size.height - frame.size.height - navigationBarFrame.size.height; self.toolBar.frame = frame; systemAction = YES; }
What it is doing is pushing the view down so I can display a toolbar (and not hiding it). Obviously this is for only the 'root view' of a tabbar + navigation controller. For any subsequent views you can set the 'hidesBottomBarWhenPushed' on the viewcontroller you are pushing.
I tried a number of the solutions above, but no joy in iOS 8. I find that setting in viewWillAppear the following works for me. Should work in iOS 7 as the extendedLayoutIncludesOpaqueBars was introduced then.
self.extendedLayoutIncludesOpaqueBars = true self.tabBarController?.tabBar.isHidden = true self.tabBarController?.tabBar.isOpaque = true
and if you need to turn tabBars on again when you leave to use the following in viewWillDisappear.
self.tabBarController?.tabBar.isHidden = false self.tabBarController?.tabBar.isOpaque = false
I use this to allow a return from a transition to keep the TabBar
hidden. Not used it in a button action but if like me you find nothing above now works, this could be the basis of a programmable solution.