So here is what i have: A UITabBarController that handles different UIViewControllers. In one of the UIViewController i am trying to switch the view being displayed when the
Subclass your TabBarController and hide the TabBar when needed:
class tabBarVC: UITabBarController {
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if size.height < size.width {
self.tabBar.hidden = true
} else {
self.tabBar.hidden = false
}
}
}
This worked for me.
- (void)viewDidLoad {
[super viewDidLoad];
previousRect = self.view.frame;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
{
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
[self.navigationController setNavigationBarHidden:TRUE animated:FALSE];
[[UIApplication sharedApplication] setStatusBarHidden:TRUE animated:FALSE];
}
else
{
[self.navigationController setNavigationBarHidden:FALSE animated:FALSE];
[[UIApplication sharedApplication] setStatusBarHidden:FALSE animated:FALSE];
}
}
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
UIInterfaceOrientation toOrientation = self.interfaceOrientation;
if ( self.tabBarController.view.subviews.count >= 2 )
{
UIView *transView = [self.tabBarController.view.subviews objectAtIndex:0];
UIView *tabBar = [self.tabBarController.view.subviews objectAtIndex:1];
if(toOrientation == UIInterfaceOrientationLandscapeLeft || toOrientation == UIInterfaceOrientationLandscapeRight) {
transView.frame = CGRectMake(0, 0, 480, 320 );
tabBar.hidden = TRUE;
}
else
{
transView.frame = previousRect;
tabBar.hidden = FALSE;
}
}
}
Maybe you want to use this
- (void)willAnimateRotationToInterfaceOrientation:UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
__block UIView *weakTabBar = [self.tabBarController.view.subviews objectAtIndex:1];
weakTabBar.alpha = 0;
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionCurveEaseIn // slow at the beggining
animations:^{
weakTabBar.alpha = 1;
}
completion:^(BOOL finished) {
weakTabBar.alpha = 1;
}];
}
}
This doesn't hide the tab bar but makes the rotate animation smoother.
If you have your UITabBarController then put a UINavigationController inside it then you can use hidesBottomBarWhenPushed (with a bit of trickery) to do this.
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
self.hidesBottomBarWhenPushed = NO;
self.navigationController.viewControllers = self.navigationController.viewControllers;
[self transitionToGridLayout];
}
else {
self.hidesBottomBarWhenPushed = YES;
self.navigationController.viewControllers = self.navigationController.viewControllers;
[self transitionToCoverflowLayout];
}
}
The trick is to push your view controller so that the hidesBottomBarWhenPushed
flag is picked up. You can use following.
self.navigationController.viewControllers = self.navigationController.viewControllers;
This code works fine but when i dismiss a uiviewcontroller which is presented modally, my view is under the status bar by 20 pixel. My view is inside a navigationcontroller so i do not hide it before rotation.