iphone:是否可以隐藏TabBar? (Pre-iOS 8)

我有一个应用程序使用UITabBarController切换模式。 在某种模式下,我想隐藏标签栏,直到该模式的步骤已经完成。 请注意,我没有使用导航控制器,因此我无法使用导航控制器上的setHidesBottomBarWhenPushed方法来隐藏选项卡栏。

在iOS 8之前,当我尝试使用以下命令来隐藏tarbar:

 self.tabBarController.tabBar.hidden = YES 

标签栏消失,但在标签栏所在的屏幕底部会留下50像素的空白区域。 我似乎无法弄清楚如何填补这个领域。 UI中的任何内容都被剪切掉,无法看到。

任何想法,如果这是可能的? 我真的很想远离导航控制器。

这是我的代码:

当然,这是在控制器的视图层次结构中进行的。 它可以改变/中断。 这使用定义的API,所以苹果公司不会在意,但他们也不会在意破坏你的代码。

 - (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 } 

编辑 :一个匿名用户build议7.0以下的补充(我还没有testing过,不能说这是一个解决方法还是一个理想的实现):

 // 1. To Hide the black line in IOS7 only, this extra bit is required if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [self.tabBarController.tabBar setTranslucent:YES]; } // 2. For IOS 7 only if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [self.tabBarController.tabBar setTranslucent:NO]; } 

编辑 :在8.x完全未经testing,可能缺乏一些布局。

像史蒂夫,我还没有find一个干净的方式来做到这一点(即使苹果Photopicker做类似的事情)。 这是我所做的:

  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; } 

它正在做的是推下视图,所以我可以显示一个工具栏(而不是隐藏它)。 显然,这仅用于Tabbar +导航控制器的“根视图”。 对于任何后续的视图,你可以在你推送的视图控制器上设置'hidesBottomBarWhenPushed'。

我尝试了上面的一些解决scheme,但在iOS 8中没有喜悦。我发现设置在viewWillAppear下面的作品对我来说。 那么应该在iOS 7中使用extendedLayoutIncludesOpaqueBars。

  self.extendedLayoutIncludesOpaqueBars = true self.tabBarController?.tabBar.isHidden = true self.tabBarController?.tabBar.isOpaque = true 

如果您在离开时需要再次打开tabBars,请在viewWillDisappear中使用以下内容。

  self.tabBarController?.tabBar.isHidden = false self.tabBarController?.tabBar.isOpaque = false 

我使用它来允许从转换返回,以保持TabBar隐藏。 不是在button操作中使用它,但是如果像我一样,你发现上面没有任何东西可以工作,这可能是一个可编程解决scheme的基础。

今天有点晚了,但是今天下午我已经回答了这个问题的所有答案,这是最适合我的那个。

如何隐藏uitabbarcontroller

 // Method call [self hideTabBar:self.tabBarController]; 

 // Method implementations - (void)hideTabBar:(UITabBarController *) tabbarcontroller { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; for(UIView *view in tabbarcontroller.view.subviews) { if([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)]; } else { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)]; } } [UIView commitAnimations]; } - (void)showTabBar:(UITabBarController *) tabbarcontroller { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; for(UIView *view in tabbarcontroller.view.subviews) { NSLog(@"%@", view); if([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)]; } else { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)]; } } [UIView commitAnimations]; } 

我只用这一行来实现这一点。 在显示具有标签栏的视图控制器之前,我使用prepareForSegue方法。

 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"showLogin"]){ [segue.destinationViewController setHidesBottomBarWhenPushed:YES]; } } 

我曾经工作过几乎相同的案例,实际上使用了http://www.developers-life.com/hide-uitabbarcontrolleruitabbar-with-animation.html中的代码,并根据我的需要做了更好的改进,这也可以帮助其他人。;

我正在使用UISplitViewController作为根视图控制器,其细节部分是UITabBarController,我不得不在纵向模式下隐藏tabbar:

 // In UITabBarController's custom implementation add following method, // this method is all that will do the trick, just call this method // whenever tabbar needs to be hidden/shown - (void) hidetabbar:(NSNumber*)isHidden { UITabBarController *tabBarController=self; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; CGRect tabbarFrame=CGRectZero; for(UIView *theView in tabBarController.view.subviews) { //NSLog(@"%@", view); if([theView isKindOfClass:[UITabBar class]]) { tabbarFrame=theView.frame; if ([isHidden boolValue]) { tabbarFrame=CGRectMake(tabbarFrame.origin.x, tabBarController.view.frame.size.height, tabbarFrame.size.width, tabbarFrame.size.height); } else { tabbarFrame=CGRectMake(tabbarFrame.origin.x, tabBarController.view.frame.size.height - tabbarFrame.size.height, tabbarFrame.size.width, tabbarFrame.size.height); } theView.frame=tabbarFrame; break; } } for(UIView *theView in tabBarController.view.subviews) { if(![theView isKindOfClass:[UITabBar class]]) { CGRect theViewFrame=theView.frame; if ([isHidden boolValue]) { theViewFrame=CGRectMake(theViewFrame.origin.x, theViewFrame.origin.y, theViewFrame.size.width, theViewFrame.size.height + tabbarFrame.size.height); } else { theViewFrame=CGRectMake(theViewFrame.origin.x, theViewFrame.origin.y, theViewFrame.size.width, theViewFrame.size.height - tabbarFrame.size.height); } theView.frame=theViewFrame; } } [UIView commitAnimations]; } 

我用下面的代码来调用hidetabbar:方法

 //In my UISplitViewController's custom implementation - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @synchronized(self){ //change the self.splitDetailController to your UITabBarController's object [self.splitDetailController performSelector:@selector(hidetabbar:) withObject:[NSNumber numberWithBool:UIInterfaceOrientationIsLandscape(interfaceOrientation)] afterDelay:0.5]; } return YES; } 

我testing了这个代码,只在模拟器工作,让我知道,如果它在设备上也可以;-)

你有没有在子视图上设置autoResizingMask?

 view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

像这样的东西应该做的伎俩,并允许坐在堆栈上的视图重新resize。

保持原有架构的显而易见的解决办法是以模态方式呈现这种视图:

 - (void)tabBarController:(UITabBarController *)tb didSelectViewController:(UIViewController *)vc { if (tb.selectedIndex == MODALONE) { UIViewController* mod = [[UIViewController alloc] initWithNibName: @"ModalView" bundle: nil]; [tb presentModalViewController:mod animated:NO]; [mod release]; } } 

该视图现在覆盖整个屏幕(除了状态栏有一个),包括标签栏,所以看起来好像标签栏已经消失,以响应用户按下该标签栏项目。

自动调整掩码有一个枚举。 尝试设置所有选项,并检查是否在父视图中选中了autoresize子视图选项

您可以创buildTabbar类别并轻松显示/隐藏。 你可以访问完整的视图。

创build类别#import "UITabBarController+HideTabBar.h"

 @implementation UITabBarController (HideTabBar) - (void)hideTabBarAnimated:(BOOL)animated { CGRect statusbarFrame = [UIApplication sharedApplication].statusBarFrame; CGRect tabBarControllerFrame = self.view.frame; if (statusbarFrame.size.height>20) { tabBarControllerFrame.size.height = screenSize.size.height + self.tabBar.frame.size.height - 20.0; } else { tabBarControllerFrame.size.height = screenSize.size.height + self.tabBar.frame.size.height ; } if (animated) { [UIView animateWithDuration:0.2 animations:^{ [self.view setFrame:tabBarControllerFrame]; } completion:^(BOOL finished) { }]; } else [self.view setFrame:tabBarControllerFrame]; } - (void)showTabBarAnimated:(BOOL)animated { CGRect statusbarFrame = [UIApplication sharedApplication].statusBarFrame; CGRect tabBarControllerFrame = self.view.frame; if (statusbarFrame.size.height>20) { tabBarControllerFrame.size.height = screenSize.size.height - 20.0; } else { tabBarControllerFrame.size.height = screenSize.size.height ; } if (animated) { [UIView animateWithDuration:0.2 animations:^{ [self.view setFrame:tabBarControllerFrame]; } completion:^(BOOL finished) { }]; } else [self.view setFrame:tabBarControllerFrame]; } @end 

注意 :使用statusbarFrame时, 热点电话打开,所以tabbar不会减less。

现在导入你想要使用方法的类的类别,只需调用下面的方法来隐藏或显示tabbar。

 [self.tabBarController hideTabBarAnimated:YES]; [self.tabBarController showTabBarAnimated:YES]; 

希望这可以帮助。

希望这个作品。

 @interface UITabBarController(Additions)

 - (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated;

 @结束

 @implementation UITabBarController(Additions)

 - (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated
 {
    如果(animation)
     {
         [UIView beginAnimations:nil context:nil];
     }
    如果(隐藏)
     {

         self.tabBar.frame = CGRectMake(self.tabBar.frame.origin.x,self.tabBar.superview.frame.size.height,self.tabBar.bounds.size.width,self.tabBar.bounds.size.height) ;
     }
    其他
     {
         self.tabBar.frame = CGRectMake(self.tabBar.frame.origin.x,self.tabBar.superview.frame.size.height  -  self.tabBar.frame.size.height + 10,self.tabBar.bounds.size。宽度,self.tabBar.bounds.size.height);
     }
    如果(animation)
     {
         [UIView commitAnimations];
     }

 }

这里是我的解决scheme(我的选项卡视图控制器是在里面的导航控制器的好措施)…所以我已经subclassed UITabBarController,并做到了这一点…暴露-setTabBarHidden:方法

 - (void)setTabBarHidden:(BOOL)hidden { _tabBarHidden = hidden; [UIView performWithoutAnimation:^{ [self adjustViews]; }]; } - (void)adjustViews { if ( _tabBarHidden ) { CGRect f = self.tabBar.frame; // move tab bar offscreen f.origin.y = CGRectGetMaxY(self.view.frame); self.tabBar.frame = f; // adjust current view frame self.selectedViewController.view.frame = self.view.frame; } else { CGRect f = self.tabBar.frame; // move tab bar on screen f.origin.y = CGRectGetMaxY(self.view.frame) - (CGRectGetMaxY(self.tabBar.bounds) + CGRectGetMaxY(self.navigationController.navigationBar.frame)); self.tabBar.frame = f; // adjust current view frame f = self.view.bounds; f.size.height -= CGRectGetMaxY(self.tabBar.bounds); self.selectedViewController.view.frame = f; } } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [UIView performWithoutAnimation:^{ [self adjustViews]; }]; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [UIView performWithoutAnimation:^{ [self adjustViews]; }]; } 

把语句放在UIViewController的init方法中

 override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) self.hidesBottomBarWhenPushed = true setupDependencyConfigurator() } 

看到这个线程:

在iphone中显示/隐藏TabBarController

总之,您可以在此示例代码中看到此行为的示例:

http://developer.apple.com/iphone/library/samplecode/TheElements/index.html

为什么你不使用导航控制器。 隐藏导航栏比标签栏更容易…

只是在UITabBarController的子类中的Monotouch中做了下面的代码:

  public void ShowTabBar() { UIView.BeginAnimations("Anim"); UIView.SetAnimationDuration(0.25f); this.View.Subviews[0].Frame = new RectangleF(0f, 0f, 320f, 431f); this.TabBar.Frame = new RectangleF(0f, 431f, 320f, 49f); this.TabBar.Hidden = false; UIView.CommitAnimations(); } public void HideTabBar() { UIView.BeginAnimations("Anim"); UIView.SetAnimationDuration(0.25f); this.View.Subviews[0].Frame = new RectangleF(0f, 0f, 320f, 480f); this.TabBar.Frame = new RectangleF(0f, 481f, 320f, 510f); this.TabBar.Hidden = true; UIView.CommitAnimations(); }