2011-05-24 7 views
6

Tengo un controlador de navegación. Para una de las vistas, quiero ocultar la barra de pestañas inferior, de modo que obtenga el máximo espacio posible en la pantalla. Para ello, tengo:Al usar ocultaBottomBarCuando se presiona, quiero que la barra de pestañas vuelva a aparecer cuando presiono otra vista

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     self.hidesBottomBarWhenPushed = YES; // To hide the tab bar 
    } 
    return self; 
} 

Pero para la siguiente opinión de que empujo en la pila, quiero que la barra de pestañas para volver a aparecer. ¿Hay alguna forma de hacer esto?

Respuesta

2

Se puede hacer que vuelva a aparecer, pero dará como resultado una animación incorrecta. La página entra a la izquierda y la barra inferior a la derecha. Entonces probablemente no sea el comportamiento que quieres. Pero en el mismo controlador, haga self.hidesBottomBarWhenPushed = NO; antes de pulsar el siguiente controlador de vista.

+0

Eso realmente funciona, sin embargo, significa que la barra inferior se desliza desde la izquierda mientras que la vista recién insertada se desliza desde la derecha: se ve muy desconcertante. Entonces otra opción sería buena. Tal vez necesito establecer su marco? – Chris

+0

Esto está bien si desactivo la animación, hemos decidido ... – Chris

11

A partir de iOS5, hay un medio muy fácil de lograr esto. Es esencialmente el mismo método que Deepak, pero no hay artefactos con la animación, todo se ve como se esperaba.

sobre inicio, establecer

self.hidesBottomBarWhenPushed = YES; 

igual que usted tiene arriba. Cuando sea el momento para empujar el nuevo controlador en la pila, es tan simple como:

self.hidesBottomBarWhenPushed = NO; 

UIViewController *controller = [[[BBListingController alloc] init] autorelease]; 
[self.navigationController pushViewController:controller]; 

self.hidesBottomBarWhenPushed = YES; 

Es importante para restablecer el valor de SI después de que el controlador ha sido empujado con el fin de volver a ocultar la barra cuando los grifos de los usuarios el botón Atrás y la vista vuelven a la vista.

1

En una vista raíz controlador "A" (que está mostrando la barra de pestañas), cuando llega el momento de mostrar otro controlador de vista "B", donde no se desea ninguna barra de pestañas:

self.hidesBottomBarWhenPushed = YES; // hide the tabBar when pushing B 
[self.navigationController pushViewController:viewController_B animated:YES]; 
self.hidesBottomBarWhenPushed = NO; // for when coming Back to A 

En vista controlador B, cuando llega el momento de mostrar un controlador tercer punto de vista C (TabBar quería de nuevo):

self.hidesBottomBarWhenPushed = NO; // show the tabbar when pushing C 
[self.navigationController pushViewController:viewController_C animated:YES]; 
self.hidesBottomBarWhenPushed = YES; // for when coming Back to B 
3

Caso uno: para ocultar UITabBarController en un UIViewController cetain, por ejemplo, al llamar self.performSegueWithIdentifier("Identifier", sender: self), es necesario antes de eso, establecer self.hidesBottomBarWhenPushed = true bandera. Y después de self.hidesBottomBarWhenPushed = false bandera. Pero tenemos que entender que a través de un UIViewController, UITabbarController volverá a aparecer y, en caso de que necesite usar UITabbarController con el único UIViewControler, no producirá el resultado correcto.

en el FirstItemViewController

@IBAction func pushToControllerAction(sender: AnyObject) { 
     self.hidesBottomBarWhenPushed = true 
     self.performSegueWithIdentifier("nextController", sender: self) 
     self.hidesBottomBarWhenPushed = false 
    } 

enter image description here

caso de que dos: Para ocultar UITabBarController en cierto UIViewController, después de lo cual un UITabBarController debe estallar, es necesario, por Por ejemplo, al llamar al self.performSegueWithIdentifier("nextController", sender: self), establecer self.hidesBottomBarWhenPushed = true antes del método. Alse willMoveToParentViewController(parent: UIViewController?) en el método debe configurarse como se muestra en el ejemplo del código.

en la primera UIViewController "FirstItemViewController"

@IBAction func pushToControllerAction(sender: AnyObject) { 
    self.hidesBottomBarWhenPushed = true 
    self.performSegueWithIdentifier("nextController", sender: self) 
} 

en la siguiente UIViewController "ExampleViewController" `

override func willMoveToParentViewController(parent: UIViewController?) { 
     if parent == nil { 
      var viewControllers = self.navigationController!.viewControllers 
      if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstItemViewController.self)) { 
       (viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false 
      } 
     } 
} 

Swift 3 código:

let viewControllers = self.navigationController!.viewControllers 
       if ((viewControllers[viewControllers.count - 2]) is (FirstItemViewController)) { 
        (viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false 
       } 

enter image description here

Test project

+0

¡Funciona a la perfección! – bubuxu

1

me he resuelto este problema como ese:

Casi todos mis ViewControllers son hijos de BaseViewController.

Así, ejemplo:

class BaseVC: UIViewController { 
    final override var hidesBottomBarWhenPushed: Bool { 
     get { 
      if navigationController?.viewControllers.last == self { 
       return prefersBottomBarHidden ?? super.hidesBottomBarWhenPushed 
      } else { 
       return false 
      } 
     } set { 
      super.hidesBottomBarWhenPushed = newValue 
     } 
    } 
    private(set) var prefersBottomBarHidden: Bool? 
} 

Sólo anular variable "prefersBottomBarHidden" en ViewController donde Bottombar debe estar oculto:

override var prefersBottomBarHidden: Bool? { return true } 
1

Ha sido un tiempo desde que esta pregunta fue hecha, pero ninguna de ellas contesta la dirección usando Storyboard segues. Resulta bastante fácil:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "MyViewControllerIdentifier" { 

     // Hide the tabbar during this segue 
     hidesBottomBarWhenPushed = true 

     // Restore the tabbar when it's popped in the future 
     DispatchQueue.main.async { self.hidesBottomBarWhenPushed = false } 

    } 
} 
Cuestiones relacionadas