Oculte TabBar y muestre la barra de herramientas de NavigationController haciendo clic en el button

Tengo la siguiente jerarquía de vistas:

Controlador de barra de tabs -> Controlador de navigation -> Controlador de vista personalizado

En mi Vista personalizada, quiero que la TabBar desaparezca y muestre una barra de herramientas en su lugar. Al igual que en la aplicación de fotos nativas iOS7 al presionar 'seleccionar'.

Probé diferentes soluciones que encontré de SO pero logré get:

  1. TabBar oculta y la barra de herramientas se muestra con espacio negro
  2. TabBar oculto y barra de herramientas oculta
  3. Barra de herramientas oculta TabBar mostrada con espacio desde abajo. Sin embargo, el contenido de la vista personalizada llega a la parte inferior de la pantalla (debajo de la barra de herramientas y en el mismo lugar que solía ser la barra de tabs)

La diferencia de otras soluciones que encontré es que necesito que esto suceda onclick y no al pulsar.

Algunas de las cosas que probé:

// #1 [self.navigationController.toolbar setHidden:!isSelecting]; [self.tabBarController.tabBar setHidden:isSelecting]; // #2 self.hidesBottomBarWhenPushed = YES; // #3 #1 & #2 variants @ different controller along the path 

Finalmente, después de jugar con la configuration, logré que funcione. No estoy seguro de por qué funciona ahora y no funcionó antes, por lo que agradecería sus comentarios.

Guión gráfico:

  1. Marcar como marcado "Ocultar barra inferior en Push" para el controller de vista personalizada
  2. Marque como marcado "Mostrar barra de herramientas" para el controller de navigation

Código:

En el button click ocultar / mostrar tabBar: [self.tabBarController.tabBar setHidden:state]

Esto casi funciona. Oculta / muestra la pestaña cuando presiona el button, pero el único problema es que la barra de tabs se oculta inicialmente al cambiar de pestaña. Tuve que hacer un esfuerzo extra para que sea visible.

Establezca UITabBarControllerDelegate para mostrar tabBar cuando cambie las tabs. Lo hice en un SUSourceTabController personalizado:

 - (void)viewDidLoad { [super viewDidLoad]; self.delegate = self; } - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController: (UIViewController *)viewController { [self.tabBar setHidden:NO]; } 

También debemos mostrarlo para la primera vista de pestaña en el código del controller de vista personalizado. Usando setHidden:NO en ningún otro lugar del código no funcionó.

 - (void)viewDidLoad { [super viewDidLoad]; [self.tabBarController.tabBar setHidden:NO]; } 

Marque esta categoría a partir de la respuesta de esta pregunta .

UITabBarController + HideTabbar.h

 #import <UIKit/UIKit.h> @interface UITabBarController (HideTabbar) - (void)setHidden:(BOOL)hidden animated:(BOOL)animated; @end 

UITabBarController + HideTabbar.m

 #import "UITabBarController+HideTabbar.h" #define kAnimationDuration .3 @implementation UITabBarController (HideTabbar) - (void)setHidden:(BOOL)hidden animated:(BOOL)animated { CGRect screenRect = [[UIScreen mainScreen] bounds]; float fHeight = screenRect.size.height; if (UIDeviceOrientationIsLandscape([UIApplication shanetworkingApplication].statusBarOrientation)) { fHeight = screenRect.size.width; } if (!hidden) { fHeight -= self.tabBar.frame.size.height; } CGFloat animationDuration = animated ? kAnimationDuration : 0.f; [UIView animateWithDuration:animationDuration animations:^{ for (UIView *view in self.view.subviews){ if ([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)]; } else { if (hidden) { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; } } } } completion:^(BOOL finished){ if (!hidden){ [UIView animateWithDuration:animationDuration animations:^{ for(UIView *view in self.view.subviews) { if (![view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; } } }]; } }]; } @end