La mejor solución que he encontrado es hacer lo siguiente en el primer controlador de vista .
C objetivo
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
Rápido
override func viewWillAppear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
Esto hará que la barra de navegación se anime desde la izquierda (junto con la siguiente vista) cuando presiona el siguiente UIViewController
en la pila, y se aleje hacia la izquierda (junto con la vista anterior), cuando presiona el botón Atrás en el UINavigationBar
.
Tenga en cuenta también que estos no son métodos delegados, está anulando UIViewController
la implementación de estos métodos y, de acuerdo con la documentación, debe llamar a la implementación del super en algún lugar de su implementación .
animated=YES
. Sé que parece feoanimated=NO
, pero parece que cuando la animación para ocultar la barra de navegación aún no está terminada, entonces se ignora la animación para mostrarla nuevamente. Aún no hay solución.Otro enfoque que encontré es establecer un delegado para
NavigationController
:y use
setNavigationBarHidden
ennavigationController:willShowViewController:animated:
Manera fácil de personalizar el comportamiento de cada
ViewController
uno en un solo lugar.fuente
Una pequeña modificación que tuve que hacer en las otras respuestas es solo mostrar la barra en viewWillDisappear si la razón por la que está desapareciendo se debe a un elemento de navegación presionado sobre ella. Esto se debe a que la vista puede desaparecer por otros motivos.
Así que solo mostraré la barra si esta vista ya no es la vista superior:
fuente
Pondría el código en la vista delegado en cada vista que se muestra:
Así, donde necesitas ocultarlo:
Como este donde necesitas mostrarlo:
fuente
La respuesta actualmente aceptada no coincide con el comportamiento previsto descrito en la pregunta. La pregunta solicita que la barra de navegación esté oculta en el controlador de vista raíz, pero visible en cualquier otro lugar, pero la respuesta aceptada oculta la barra de navegación en un controlador de vista particular. ¿Qué sucede cuando otra instancia del primer controlador de vista se inserta en la pila? Ocultará la barra de navegación aunque no estemos mirando el controlador de vista raíz.
En cambio, la estrategia de @Chad M. de usar el
UINavigationControllerDelegate
es buena, y aquí hay una solución más completa. Pasos:UINavigationController
-navigationController:willShowViewController:animated
método para mostrar u ocultar la barra de navegación en función de si muestra el controlador de vista raízEl código completo para esta solución se puede encontrar en este Gist . Aquí está la
navigationController:willShowViewController:animated
implementación:fuente
en Swift 3:
fuente
navcontroller.navagationBarHidden
se romperá todo el controlador de navegación (sin deslizar hacia adelante y hacia atrás). Para que funcione, utilicé en sunavigationController?.navigationBar.hidden
lugar. Deslizar todavía funciona y no deja espacio vacío porque parece estar dentro de una vista de pila o algo asíDale mi crédito a la respuesta de @ chad-m.
Aquí está la versión Swift:
MyNavigationController.swift
Diferencia entre la respuesta de chad-m y la mía:
Herede de UINavigationController, por lo que no contaminará su rootViewController.
use en
self.viewControllers.first
lugar dehomeViewController
, por lo que no hará esto 100 veces para sus 100 UINavigationControllers en 1 StoryBoard.fuente
Después de varias pruebas aquí es cómo lo hice funcionar para lo que quería. Esto es lo que estaba intentando. - Tengo una vista con una imagen. y quería que la imagen pasara a pantalla completa. - Tengo un controlador de navegación con una barra de pestañas también. Entonces necesito ocultar eso también. - Además, mi requisito principal no era solo esconderme, sino también tener un efecto de desvanecimiento al mostrar y ocultar.
Así es como lo hice funcionar.
Paso 1: tengo una imagen y el usuario toca esa imagen una vez. Capturo ese gesto y lo introduzco en el nuevo
imageViewController
, está en elimageViewController
, quiero tener una imagen de pantalla completa.Paso 2: todos estos pasos a continuación se encuentran en ImageViewController
Paso 2.1 - En ViewDidLoad, muestra la barra de navegación
Paso 2.2 - En
viewDidAppear
, configure una tarea de temporizador con retraso (lo tengo configurado para 1 segundo de retraso). Y después del retraso, agregue efecto de desvanecimiento. Estoy usando alfa para usar el desvanecimiento.paso 2.3: debajo
viewWillAppear
, agrega un gesto SingleTap a la imagen y haz que la barra de navegación sea translúcida.Paso 3 - Finalmente
viewWillDisappear
, asegúrate de volver a poner todofuente
En caso de que alguien todavía tenga problemas con el error de cancelación rápida de backswipe como @fabb comentó en la respuesta aceptada.
Me las arreglo para anular esto
viewDidLayoutSubviews
, además de loviewWillAppear/viewWillDisappear
que se muestra a continuación:En mi caso, noto que se debe a que el controlador de vista raíz (donde se oculta la navegación) y el controlador de vista presionado (se muestra la navegación) tiene diferentes estilos de barra de estado (por ejemplo, oscuro y claro). En el momento en que inicie el movimiento hacia atrás para mostrar el controlador de vista, habrá una animación de color de la barra de estado adicional. Si suelta el dedo para cancelar el pop interactivo, mientras la animación de la barra de estado no está terminada , la barra de navegación desaparece para siempre.
Sin embargo, este error no ocurre si los estilos de barra de estado de ambos controladores de vista son los mismos.
fuente
Si lo que desea es ocultar completamente la barra de navegación en el controlador, una solución mucho más limpia es, en el controlador raíz, tener algo como:
Cuando presiona una vista secundaria en el controlador, la barra de navegación permanecerá oculta; si desea mostrarlo solo en el elemento secundario, agregará el código para mostrar
it(self.navigationController.navigationBarHidden=NO;)
en laviewWillAppear
devolución de llamada y, de manera similar, el código para ocultarloviewWillDisappear
fuente
La implementación más simple puede ser que cada controlador de vista especifique si su barra de navegación está oculta o no en su
viewWillAppear:animated:
método. El mismo enfoque funciona bien para ocultar / mostrar la barra de herramientas también:fuente
Ocultar la barra de navegación solo en la primera página también se puede lograr a través del guión gráfico. En el guión gráfico, vaya a Escena del controlador de navegación-> Barra de navegación . Y seleccione la propiedad ' Oculta ' del inspector de atributos . Esto ocultará la barra de navegación desde el primer controlador de vista hasta que se haga visible para el controlador de vista requerido.
La barra de navegación se puede volver a configurar en visible en la devolución de llamada ViewWillAppear de ViewController.
fuente
Swift 4:
En el controlador de vista del que desea ocultar la barra de navegación.
fuente
Al implementar este código en su ViewController, puede obtener este efecto. En realidad, el truco es ocultar la barra de navegación cuando se inicia ese controlador
y mostrar la barra de navegación cuando el usuario abandona esa página, hacer esto es viewWillDisappear
fuente