2010-05-28 39 views
140

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.Barra de navegación mostrar/ocultar

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 siempre son apreciadas.

Respuesta

353

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

mostrarlo:

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

Documentación para este método es available here.

Para escuchar un "doble clic" o doble toque, subclase UIView y crear una instancia de esa subclase de la propiedad del controlador de vista view.

En la subclase de vista, anule su método -touchesEnded:withEvent: y cuente cuántos toques obtiene en un período de tiempo, midiendo el tiempo entre dos toques consecutivos, quizás con -timeIntervalSinceDate:. O pruebe el resultado en [touch tapCount].

Si obtiene dos toques, su vista subclasificada emite un NSNotification que su controlador de vista ha registrado para escuchar.

Cuando su controlador de vista escucha la notificación, activa un selector que oculta o muestra la barra de navegación usando el código mencionado, dependiendo del estado visible actual de la barra de navegación, al acceder leyendo la propiedad isHidden de la barra de navegación.

EDITAR

La parte de mi respuesta para el manejo de eventos del grifo es probablemente útil de vuelta antes de IOS 3.1. La clase UIGestureRecognizer es probablemente un mejor enfoque para manejar doble toque, en estos días.

EDIT 2

La forma Swift para ocultar la barra de navegación es:

self.navigationController?.setNavigationBarHidden(true, animated: true) 

mostrarlo:

self.navigationController?.setNavigationBarHidden(false, animated: true) 
+0

Si se trata de una aplicación de visor de fotos, ocultando la barra de navegación provoca un salto desagradable para la imagen ver, que no he encontrado cómo prevenir. 3.2 le permite usar UIGestureRecognizer para doble toque, que es un enfoque mucho más ordenado (para iPad solo atm). –

+0

Muchas gracias Alex, me proporcionó mucha información, voy a seguir sus directrices ... gracias a la tonelada – iscavengers

+0

¿Es esto lo mismo que se aplica para las barras de tabulación? si quiero ocultar/mostrar las barras de pestañas ¿qué debo hacer? saludos shishir – iscavengers

14

Primero lea la la sección de la programación Vista Controlador Guía para iOS sobre 'Adoptar un diseño de pantalla completa para vistas de navegación' y la sección sobre la misma para Vistas personalizadas. Si está intentando hacer algo como Photos.app, probablemente esté usando una vista de desplazamiento. Tenga en cuenta el comentario de que las barras de navegación agregan automáticamente una inserción de contenido de desplazamiento a 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) inmediatamente 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 active o desactive la barra de navegación y/o la barra de estado, debe hacer dos cosas en el método de alternar. El primero parece ser guardar la propiedad contentOffset de la vista de desplazamiento antes de cambiar la propiedad oculta de NavigationBar y restaurar el valor guardado a contentOffset inmediatamente después. Y segundo para volver a poner a cero la propiedad contentInset para 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.

+0

Muchas gracias por la nota contentOffset y contentInset. Tú el verdadero héroe. – Altealice

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

Para ocultar Barra de navegación:

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

para mostrar la barra de navegación:

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

En iOS 7, autocompletar realmente promueve esta solución en comparación con la más votada. –

9

En Swift probar esto,

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

o

self.navigationController?.setNavigationBarHidden(true, animated: true) //Hide 
self.navigationController?.setNavigationBarHidden(false, animated: true) //SHow 
5

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

self.navigationController.hidesBarsOnTap = YES; 

Esto funcionará en 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 se puede modificar este comportamiento en su controlador dentro del viewWillAppear: viewWillDisappear y acciones: si le gustaría establecer el comportamiento sólo para un único controlador de vista.

Aquí es el documentation:

-2

CODIGO SWIFT: Esto funciona plenamente 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) 

luego 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 deficiente, al agregar un gesto de toque, si no se configura correctamente eliminará los gestos en otras vistas como UITableView o UICollectionView. También verifica si un booleano == verdadero es redundante y puede llevar a otros programadores a pensar que es una buena práctica. También está haciendo un uso indebido de camel case y le falta un corsé final en su ejemplo. Tenga en cuenta que los 2.2 selectores rápidos 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 –

2

Una forma podría ser desmarcando Bar Visibilidad "Muestra la barra de navegación" en el atributo Inspector.Hope esto ayuda a alguien.

enter image description here

Cuestiones relacionadas