Barra de navegación mostrar / ocultar


158

Tengo una aplicación con una barra de navegación que consta de 2 botones de barra. Me gustaría ocultar y mostrar esta barra de navegación cuando un usuario toca dos veces la pantalla.

Inicialmente, la barra de navegación debe estar oculta. Cuando un usuario toca dos veces la pantalla, la barra de navegación debe aparecer con una animación, como lo que se puede ver en la galería de fotos del iPhone.

¿Cómo puedo hacer algo así? Las sugerencias son siempre apreciadas.

Respuestas:


381

Esto no es algo que pueda caber en unas pocas líneas de código, pero este es un enfoque que podría funcionar para usted.

Para ocultar la barra de navegación:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

Para mostrarlo:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

La documentación para este método está disponible aquí .

Para escuchar un "doble clic" o doble toque, subclase UIViewy haga una instancia de esa subclase viewpropiedad de su controlador de vista .

En la subclase de vista, anule su -touchesEnded:withEvent:método y cuente cuántos toques obtiene en una duración de tiempo, midiendo el tiempo entre dos toques consecutivos, tal vez con CACurrentMediaTime(). O prueba el resultado de [touch tapCount].

Si obtiene dos toques, su vista de subclase emite y NSNotificationsu controlador de vista se ha registrado para escuchar.

Cuando su controlador de vista escucha la notificación, dispara un selector que oculta o muestra la barra de navegación usando el código mencionado anteriormente, dependiendo del estado visible actual de la barra de navegación, al que se accede leyendo la isHiddenpropiedad de la barra de navegación .

EDITAR

La parte de mi respuesta para manejar eventos de tap es probablemente útil antes de iOS 3.1. La UIGestureRecognizerclase es probablemente un mejor enfoque para manejar doble toque, en estos días.

EDITAR 2

La forma rápida de ocultar la barra de navegación es:

navigationController?.setNavigationBarHidden(true, animated: true)

Para mostrarlo:

navigationController?.setNavigationBarHidden(false, animated: true)

Si esto es para una aplicación de visor de fotos, ocultar la barra de navegación provoca un salto desagradable para la vista de la imagen, que no he encontrado cómo prevenir. 3.2 le permite usar UIGestureRecognizer para toques dobles, que es un enfoque mucho más ordenado (solo para cajeros automáticos iPad).
Paul Lynch

Muchas gracias Alex, me diste mucha información, voy a seguir tus pautas ...
muchas

¿Se aplica lo mismo a las barras de pestañas? si quiero ocultar / mostrar barras de pestañas dan wat que debo hacer? saludos shishir
Shishir.bobby

1
¿Hay alguna manera de evitar este "salto" que mencionó Paul? Tengo el mismo problema y no sé qué lo causa ... tampoco creo que nadie se haya topado con él.
Icky

Para evitar que ocurra el 'salto', debe restablecer la propiedad contentInset de la vista de desplazamiento como menciona jclee, después de ocultar / mostrar la barra de navegación. es decir. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

Este código te ayudará.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16

Primero lea la sección en la Guía de programación del controlador de vista para iOS sobre 'Adoptar un diseño de pantalla completa para las vistas de navegación' y la sección más o menos igual para las vistas personalizadas. Si está intentando hacer algo como Photos.app, probablemente esté utilizando una vista de desplazamiento. Tenga en cuenta el comentario de que las barras de navegación agregan automáticamente un contenido de desplazamiento insertado en su vista de desplazamiento para tener en cuenta la altura de la barra de navegación (y la barra de estado), por lo que debe restablecer la propiedad contentInset de su vista de desplazamiento a cero (UIEdgeInsetsZero) justo después configurando el estado inicial de la barra de navegación y antes de que aparezca la vista.

Luego, si tiene un solo toque que alterna la barra de navegación y / o la barra de estado para mostrar u ocultar, debe hacer dos cosas en su método de alternancia. El primero parece ser guardar la propiedad contentOffset de la vista de desplazamiento antes de cambiar la propiedad oculta NavigationBar y restaurar el valor guardado en contentOffset inmediatamente después. Y en segundo lugar, vuelva a poner a cero la propiedad contentInset en UIEdgeInsetsZero después de cambiar la propiedad navigationBarHidden. Además, si está alternando la barra de estado, debe cambiar su estado antes de cambiar el estado de la barra de navegación.


1
Muchas gracias por la nota contentOffset y contentInset. Eres el verdadero héroe.
Altealice el

Estoy de acuerdo, eres el verdadero héroe, aquí! Muchas gracias.
Gaetan el

9

En Swift prueba esto,

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

o

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

Para ocultar la barra de navegación:

[self.navigationController setNavigationBarHidden:YES animated:YES];

Para mostrar la barra de navegación:

[self.navigationController setNavigationBarHidden:NO animated:YES];

En iOS 7, la función de autocompletar realmente promueve esta solución en lugar de la más votada.
Alex Zavatone

7

Aquí hay una solución muy rápida y simple:

self.navigationController.hidesBarsOnTap = YES;

Esto funcionará con un solo toque en lugar de doble toque. También cambiará el comportamiento del controlador de navegación incluso después de presionar o hacer estallar el controlador de vista actual.

Siempre puede modificar este comportamiento en su controlador dentro de viewWillAppear: y viewWillDisappear: acciones si desea establecer el comportamiento solo para un único controlador de vista.

Aquí está la documentación :


5

Una forma podría ser desmarcando la barra de visibilidad "Muestra la barra de navegación" en el inspector de atributos. Espero que esto ayude a alguien.

ingrese la descripción de la imagen aquí


2

En Swift 4.2 y Xcode 10

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

Si no desea mostrar la barra de navegación solo en 1st VC, pero desea mostrar en 2nd VC onword's

En su primer VC, escriba este código.

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}

2

Si desea detectar el estado de la barra de navegación si está oculta / mostrada. Simplemente puede usar el siguiente código para detectar:

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

CÓDIGO SWIFT: funciona completamente para iOS 3.2 y versiones posteriores.

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

a continuación, escribir

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}

1
Creo que esta es una solución pobre, agregar un gesto de toque puede, si no está configurado correctamente, eliminar gestos en otras vistas como UITableView o UICollectionView. También comprobar si un valor booleano == verdadero es redundante y puede llevar a otros programadores a pensar que es una buena práctica. También estás usando mal el caso de camello y te falta una llave de extremo en tu ejemplo. Tenga en cuenta que los selectores swift 2.2 también se han actualizado. Por último, Swift solo es compatible con iOS 7 y superior y definitivamente no se ejecutará en iOS 3.2
David Rees
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.