ios iphone objective-c ios7 uinavigationbar

ios - Imitar Facebook hide/show expandir/contraer Navigation Bar



iphone objective-c (19)

Además de la respuesta de Iwburk, agregué lo siguiente para corregir el problema alfa en barras de navegación no personalizadas y para restablecer la barra de navegación en el método viewWillDisappear:

- (void)updateBarButtonItems:(CGFloat)alpha { for (UIView *view in self.navigationController.navigationBar.subviews) { NSString *className = NSStringFromClass([view class]); if ( ![className isEqualToString:@"_UINavigationBarBackground"] ) { view.alpha = alpha; } } } - (void)resetNavigationBar { CGRect frame = self.navigationController.navigationBar.frame; frame.origin.y = 20; [self.navigationController.navigationBar setFrame:frame]; [self updateBarButtonItems:1.0f]; }

En la nueva aplicación iOS7 Facebook para iPhone, cuando el usuario se desplaza, la navigationBar se oculta gradualmente hasta un punto en que desaparece por completo. Luego, cuando el usuario se desplaza hacia abajo, la navigationBar se muestra gradualmente.

¿Cómo implementarías este comportamiento tú mismo? Soy consciente de la siguiente solución, pero desaparece de inmediato y no está ligada a la velocidad del gesto de desplazamiento del usuario.

[navigationController setNavigationBarHidden: YES animated:YES];

Espero que esto no sea un duplicado ya que no estoy seguro de cuál es la mejor manera de describir el comportamiento de "expansión / contratación".


Aquí está mi implementación: SherginScrollableNavigationBar .

En mi enfoque, estoy usando KVO para observar el estado de UIScrollView , por lo que no es necesario usar un delegado (y puedes usar este delegado para cualquier otra cosa que necesites).


Aquí hay una implementación más: ¡ TLYShyNavBar v1.0.0!

Decidí hacer las mías después de probar las soluciones provistas, y para mí, tenían un rendimiento pobre, tenían una barrera alta de entrada y un código de placa de caldera, o carecían de la vista de extensión debajo de la barra de navegación. Para usar este componente, todo lo que tienes que hacer es:

self.shyNavBarManager.scrollView = self.scrollView;

Ah, y está probado en batalla en nuestra propia aplicación.


EDITAR: solo para iOS 8 y superior.

Puedes intentar usar

self.navigationController.hidesBarsOnSwipe = YES;

Funciona para mi.

Si su codificación es rápida, debe usarla de esta manera (desde https://.com/a/27662702/2283308 )

navigationController?.hidesBarsOnSwipe = true


Encontré todas las respuestas dadas en Objective-C. Esta es mi respuesta en Swift 3. Este es un código muy genérico y se puede usar directamente. Funciona con UIScrollView y UITableView.

var lastContentOffset: CGPoint? = nil var maxMinus: CGFloat = -24.0 var maxPlus: CGFloat = 20.0 var initial: CGFloat = 0.0 override func viewDidLoad() { super.viewDidLoad() self.title = "Alarm Details" self.lastContentOffset = self.alarmDetailsTableView.contentOffset initial = maxPlus } func scrollViewDidScroll(_ scrollView: UIScrollView) { var navigationBarFrame: CGRect = self.navigationController!.navigationBar.frame let currentOffset = scrollView.contentOffset if (currentOffset.y > (self.lastContentOffset?.y)!) { if currentOffset.y > 0 { initial = initial - fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y)) } else if scrollView.contentSize.height < scrollView.frame.size.height { initial = initial + fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y)) } } else { if currentOffset.y < scrollView.contentSize.height - scrollView.frame.size.height { initial = initial + fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y)) } else if scrollView.contentSize.height < scrollView.frame.size.height && initial < maxPlus { initial = initial - fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y)) } } initial = (initial <= maxMinus) ? maxMinus : initial initial = (initial >= maxPlus) ? maxPlus : initial navigationBarFrame.origin.y = initial self.navigationController!.navigationBar.frame = navigationBarFrame scrollView.frame = CGRect(x: 0.0, y: initial + navigationBarFrame.size.height , width: navigationBarFrame.size.width, height: self.view.frame.size.height - (initial + navigationBarFrame.size.height)) let framePercentageHidden: CGFloat = ((20 - navigationBarFrame.origin.y) / (navigationBarFrame.size.height)); self.lastContentOffset = currentOffset; self.updateBarButtonItems(alpha: 1 - framePercentageHidden) } func updateBarButtonItems(alpha: CGFloat) { self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.darkGray.withAlphaComponent(alpha)] self.navigationController?.navigationBar.isUserInteractionEnabled = (alpha < 1) ? false: true guard (self.navigationItem.leftBarButtonItems?.count) != nil else { return } for (_, value) in self.navigationItem.leftBarButtonItems!.enumerated() { value.customView?.alpha = alpha } guard (self.navigationItem.rightBarButtonItems?.count) != nil else { return } for (_, value) in (self.navigationItem.rightBarButtonItems?.enumerated())! { value.customView?.alpha = alpha } }

La lógica de configurar alfa para elementos de navegación se copia de la respuesta @ y se reescribe en Swift 3.


Estaba buscando una solución que permitiera cualquier estilo y comportamiento. Notarás que el comportamiento de condensación de la barra es diferente en muchas aplicaciones diferentes. Y, por supuesto, la forma en que se ve la barra es totalmente diferente entre las aplicaciones.

Creé una solución para este problema con github.com/bryankeller/BLKFlexibleHeightBar

Puede definir sus propias reglas de comportamiento para controlar cómo y cuándo la barra se contrae y crece, y puede definir exactamente cómo desea que las subvistas de la barra reaccionen ante la condensación o el crecimiento de la barra.

Echa un vistazo a mi proyecto si quieres mucha flexibilidad para crear cualquier clase de barra de encabezado que puedas imaginar.


Esto funciona para iOS 8 y versiones posteriores y asegura que la barra de estado aún conserva su fondo

self.navigationController.hidesBarsOnSwipe = YES; CGRect statuBarFrame = [UIApplication sharedApplication].statusBarFrame; UIView *statusbarBg = [[UIView alloc] initWithFrame:statuBarFrame]; statusbarBg.backgroundColor = [UIColor blackColor]; [self.navigationController.view addSubview:statusbarBg];

Y si desea mostrar la barra de navegación cuando toca en la barra de estado, puede hacer esto:

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView { self.navigationController.navigationBarHidden = NO; }


Intenté emular este comportamiento en una situación en la que necesitaba un encabezado personalizado sentado sobre una UITableView. Lancé mi propia barra de "navegación" porque esta se encuentra debajo de un montón de otras cosas en la página y quería que los encabezados de las secciones siguieran el comportamiento predeterminado de "acoplamiento". Creo que encontré una forma muy inteligente y concisa de ajustar un UITableView / UIScrollView junto con otro objeto en un estilo similar al visto en Facebook / Instagram / Chrome / etc. aplicaciones.

En mi archivo .xib, tengo mis componentes cargados en una vista de forma libre: http://imgur.com/0z9yebJ (lo siento, no tengo el representante para las imágenes en línea)

Tenga en cuenta que, en la barra lateral izquierda, la tabla se ordena detrás de la vista principal del encabezado. No se puede ver desde la captura de pantalla, pero también tiene la misma posición y que la vista principal del encabezado. Como se extiende fuera de la vista, la propiedad contentInset en UITableView se establece en 76 (el alto de la vista del encabezado principal).

Para hacer que la vista principal del encabezado se levante al unísono con UIScrollView, utilizo los métodos scrollViewDidScroll de UIScrollViewDelegate para realizar algunos cálculos y cambiar el contentInset de UIScrollView, así como el marco de la vista principal del encabezado.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { UIEdgeInsets insets = scrollView.contentInset; //tableViewInsetDelta and tableViewOriginalInsetValue are NSInteger variables that I set to 0 and 76, respectively, in viewDidLoad tableViewInsetDelta = tableViewOriginalInsetValue + scrollView.contentOffset.y; insets.top = tableViewOriginalInsetValue - tableViewInsetDelta; if (scrollView.contentOffset.y > -76 && scrollView.contentOffset.y < 0) { [scrollView setContentInset:insets]; self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44 - tableViewInsetDelta, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height); } else if (scrollView.contentOffset.y > 0) { insets.top = 0; [scrollView setContentInset:insets]; self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, -32, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height); } else if (scrollView.contentOffset.y < -76) { insets.top = 76; [scrollView setContentInset:insets]; self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height); } }

La primera instrucción if hace la mayor parte del trabajo pesado, pero tuve que incluir las otras dos para manejar situaciones en las que el usuario arrastra con fuerza y ​​los valores contentOffset iniciales enviados a scrollViewDidScroll están fuera del rango de la primera instrucción if .

En definitiva, esto está funcionando realmente bien para mí. Odio cargar mis proyectos con un montón de subclases hinchadas. No puedo decir si esta es la mejor solución para el rendimiento (siempre he dudado en poner cualquier código en scrollViewDidScroll ya que se llama todo el tiempo), pero la huella del código es la más pequeña que he visto en cualquier solución para este problema y no implica anidar una UITableView en un UIScrollView (Apple informa que esto no es así en la documentación y los eventos táctiles terminan un poco funky en el UITableView). ¡Espero que esto ayude a alguien!


Intenté implementar GTScrollNavigationBar, pero mi aplicación requirió que modificara las restricciones de diseño automático. Decidí poner un ejemplo de mi implementación en GitHub en caso de que alguien más tenga que hacer esto con el diseño automático. El otro problema que tuve con la mayoría de las otras implementaciones es que las personas no establecen los límites de la vista de desplazamiento para evitar el efecto de desplazamiento de paralaje que crea mientras se desplaza y ajusta el tamaño de la vista de desplazamiento simultáneamente.

Consulte JSCollapsingNavBarViewController si necesita hacer esto con el diseño automático. He incluido dos versiones, una con la barra de navegación solamente y otra con una barra inferior debajo de la barra de navegación que se contrae antes de colapsar la barra de navegación.


La solución dada por @peerless es un gran comienzo, pero solo inicia una animación cada vez que comienza el arrastre, sin considerar la velocidad del desplazamiento. Esto da como resultado una experiencia más agitada de la que obtienes en la aplicación de Facebook. Para que coincida con el comportamiento de Facebook, tenemos que:

  • ocultar / mostrar la barra de navegación a una velocidad que es proporcional a la velocidad de arrastre
  • inicia una animación para ocultar completamente la barra si el desplazamiento se detiene cuando la barra está parcialmente oculta
  • atenúa los elementos de la barra de navegación a medida que la barra se encoge.

Primero, necesitarás la siguiente propiedad:

@property (nonatomic) CGFloat previousScrollViewYOffset;

Y aquí están los métodos UIScrollViewDelegate :

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGRect frame = self.navigationController.navigationBar.frame; CGFloat size = frame.size.height - 21; CGFloat framePercentageHidden = ((20 - frame.origin.y) / (frame.size.height - 1)); CGFloat scrollOffset = scrollView.contentOffset.y; CGFloat scrollDiff = scrollOffset - self.previousScrollViewYOffset; CGFloat scrollHeight = scrollView.frame.size.height; CGFloat scrollContentSizeHeight = scrollView.contentSize.height + scrollView.contentInset.bottom; if (scrollOffset <= -scrollView.contentInset.top) { frame.origin.y = 20; } else if ((scrollOffset + scrollHeight) >= scrollContentSizeHeight) { frame.origin.y = -size; } else { frame.origin.y = MIN(20, MAX(-size, frame.origin.y - scrollDiff)); } [self.navigationController.navigationBar setFrame:frame]; [self updateBarButtonItems:(1 - framePercentageHidden)]; self.previousScrollViewYOffset = scrollOffset; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self stoppedScrolling]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (!decelerate) { [self stoppedScrolling]; } }

También necesitará estos métodos de ayuda:

- (void)stoppedScrolling { CGRect frame = self.navigationController.navigationBar.frame; if (frame.origin.y < 20) { [self animateNavBarTo:-(frame.size.height - 21)]; } } - (void)updateBarButtonItems:(CGFloat)alpha { [self.navigationItem.leftBarButtonItems enumerateObjectsUsingBlock:^(UIBarButtonItem* item, NSUInteger i, BOOL *stop) { item.customView.alpha = alpha; }]; [self.navigationItem.rightBarButtonItems enumerateObjectsUsingBlock:^(UIBarButtonItem* item, NSUInteger i, BOOL *stop) { item.customView.alpha = alpha; }]; self.navigationItem.titleView.alpha = alpha; self.navigationController.navigationBar.tintColor = [self.navigationController.navigationBar.tintColor colorWithAlphaComponent:alpha]; } - (void)animateNavBarTo:(CGFloat)y { [UIView animateWithDuration:0.2 animations:^{ CGRect frame = self.navigationController.navigationBar.frame; CGFloat alpha = (frame.origin.y >= y ? 0 : 1); frame.origin.y = y; [self.navigationController.navigationBar setFrame:frame]; [self updateBarButtonItems:alpha]; }]; }

Para un comportamiento ligeramente diferente, reemplace la línea que scrollViewDidScroll la barra cuando se desplaza (el bloque else en scrollViewDidScroll ) con este:

frame.origin.y = MIN(20, MAX(-size, frame.origin.y - (frame.size.height * (scrollDiff / scrollHeight))));

Esto posiciona la barra en función del último porcentaje de desplazamiento, en lugar de una cantidad absoluta, lo que da como resultado un fundido más lento. El comportamiento original es más parecido a Facebook, pero también me gusta este.

Nota: esta solución solo es iOS 7+. Asegúrese de agregar las comprobaciones necesarias si admite versiones anteriores de iOS.


Lo intenté de esta manera, espero que ayude. simplemente implemente el código en el método de delegado y configúrelo en la vista / subvista deseada

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGRect frame=self.view.frame; CGRect resultFrame=CGRectZero; if(scrollView.contentOffset.y==0 || scrollView.contentOffset.y<0){ self.lastContentOffset=0; self.offset=0; resultFrame=CGRectMake(0, frame.size.height-(40-self.offset.intValue), frame.size.width, 40-self.offset.intValue); // Pass the resultFrame [self showHide:YES withFrame:resultFrame]; }else if (self.lastContentOffset > scrollView.contentOffset.y){ NSNumber *temp=[NSNumber numberWithDouble:self.lastContentOffset-scrollView.contentOffset.y]; if(temp.intValue>40 || self.offset.intValue<temp.intValue){ self.offset=[NSNumber numberWithInt:0]; resultFrame=CGRectMake(0, frame.size.height-(40-self.offset.intValue), frame.size.width, 40-self.offset.intValue); // Pass the resultFrame [self showHide:YES withFrame:resultFrame]; }else{ if(temp.intValue>0){ self.offset=[NSNumber numberWithInt:self.offset.intValue-temp.intValue]; resultFrame=CGRectMake(0, frame.size.height-(40-self.offset.intValue), frame.size.width, 40-self.offset.intValue); // Pass the resultFrame [self showHide:YES withFrame:resultFrame]; } } }else if (self.lastContentOffset < scrollView.contentOffset.y){ NSNumber *temp=[NSNumber numberWithDouble:scrollView.contentOffset.y-self.lastContentOffset]; if(self.offset.intValue>40 || (self.offset.intValue+temp.intValue)>40){ self.offset=[NSNumber numberWithInt:40]; // Pass the resultFrame [self showHide:NO withFrame:resultFrame]; }else{ self.offset=[NSNumber numberWithInt:self.offset.intValue+temp.intValue]; resultFrame=CGRectMake(0, frame.size.height-(40-self.offset.intValue), frame.size.width, 40-self.offset.intValue); // Pass the resultFrame [self showHide:YES withFrame:resultFrame]; } } self.lastContentOffset = scrollView.contentOffset.y; } -(void)showHide:(Boolean)boolView withFrame:(CGRect)frame{ if(showSRPFilter){ //Assign value of "frame"to any view on which you wan to to perform animation }else{ //Assign value of "frame"to any view on which you wan to to perform animation } }


Por favor, prueba esta solución mía y cuéntame por qué esto no es tan bueno como las respuestas anteriores.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { if (fabs(velocity.y) > 1) [self hideTopBar:(velocity.y > 0)]; } - (void)hideTopBar:(BOOL)hide { [self.navigationController setNavigationBarHidden:hide animated:YES]; [[UIApplication sharedApplication] setStatusBarHidden:hide withAnimation:UIStatusBarAnimationSlide]; }


Puedes echar un vistazo a mi GTScrollNavigationBar . He subclase UINavigationBar para hacer que se desplace según el desplazamiento de un UIScrollView.

Nota: Si tiene una barra de navegación OPAQUE, la vista de desplazamiento debe EXPANDIR ya que la barra de navegación se OCULTA. Esto es exactamente lo que hace GTScrollNavigationBar. (Al igual que, por ejemplo, Safari en iOS).


Tengo algún tipo de solución rápida y sucia para eso. No he hecho ninguna prueba en profundidad, pero esta es la idea:

Esa propiedad mantendrá todos los elementos en la barra de navegación para mi clase UITableViewController

@property (strong, nonatomic) NSArray *navBarItems;

En la misma clase UITableViewController tengo:

-(void)scrollViewDidScrollToTop:(UIScrollView *)scrollView { if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){ return; } CGRect frame = self.navigationController.navigationBar.frame; frame.origin.y = 20; if(self.navBarItems.count > 0){ [self.navigationController.navigationBar setItems:self.navBarItems]; } [self.navigationController.navigationBar setFrame:frame]; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){ return; } CGRect frame = self.navigationController.navigationBar.frame; CGFloat size = frame.size.height - 21; if([scrollView.panGestureRecognizer translationInView:self.view].y < 0) { frame.origin.y = -size; if(self.navigationController.navigationBar.items.count > 0){ self.navBarItems = [self.navigationController.navigationBar.items copy]; [self.navigationController.navigationBar setItems:nil]; } } else if([scrollView.panGestureRecognizer translationInView:self.view].y > 0) { frame.origin.y = 20; if(self.navBarItems.count > 0){ [self.navigationController.navigationBar setItems:self.navBarItems]; } } [UIView beginAnimations:@"toggleNavBar" context:nil]; [UIView setAnimationDuration:0.2]; [self.navigationController.navigationBar setFrame:frame]; [UIView commitAnimations]; }

Eso es solo para ios> = 7, es feo, pero conozco una manera rápida de lograr esto. Cualquier comentario / sugerencia es bienvenido :)


Todos estos enfoques parecen demasiado complicados ... Así que naturalmente, construí el mío:

class ViewController: UIViewController, UIScrollViewDelegate { var originalNavbarHeight:CGFloat = 0.0 var minimumNavbarHeight:CGFloat = 0 weak var scrollView:UIScrollView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // setup delegates scrollView.delegate = self // save the original nav bar height originalNavbarHeight = navigationController!.navigationBar.height } func scrollViewDidScroll(scrollView: UIScrollView) { // will relayout subviews view.setNeedsLayout() // calls viewDidLayoutSubviews } override func viewDidLayoutSubviews() { var percentageScrolled = min(scrollView.contentOffset.y / originalNavbarHeight, 1) navigationController?.navigationBar.height = min(max((1 - percentageScrolled) * originalNavbarHeight, minimumNavbarHeight), originalNavbarHeight) // re-position and scale scrollview scrollView.y = navigationController!.navigationBar.height + UIApplication.sharedApplication().statusBarFrame.height scrollView.height = view.height - scrollView.y } override func viewWillDisappear(animated: Bool) { navigationController?.navigationBar.height = originalNavbarHeight } }


Una extensión de la respuesta de @Iwburk ... En lugar de cambiar el origen de la barra de navegación, necesitaba expandir / reducir el tamaño de la barra de navegación.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGRect frame = self.previousRect; // a property set in the init method to hold the initial size of the uinavigationbar CGFloat size = frame.size.height; CGFloat framePercentageHidden = ((MINIMUMNAVBARHEIGHT - frame.origin.y) / (frame.size.height - 1)); CGFloat scrollOffset = scrollView.contentOffset.y; CGFloat scrollDiff = scrollOffset - self.previousScrollViewYOffset; CGFloat scrollHeight = scrollView.frame.size.height; CGFloat scrollContentSizeHeight = scrollView.contentSize.height + scrollView.contentInset.bottom; if (scrollOffset <= -scrollView.contentInset.top) { frame.origin.y = -MINIMUMNAVBARHEIGHT; } else if ((scrollOffset + scrollHeight) >= scrollContentSizeHeight) { frame.origin.y = -size; } else { frame.origin.y = MIN(-MINIMUMNAVBARHEIGHT, MAX(-size, frame.origin.y - scrollDiff)); } self.previousRect = CGRectMake(0, frame.origin.y, self.jsExtendedBarView.frame.size.width, 155); self.layoutConstraintExtendedViewHeight.constant = MAXIMUMNAVBARHEIGHT + frame.origin.y + MINIMUMNAVBARHEIGHT; [self updateBarButtonItems:(1 - framePercentageHidden)]; self.previousScrollViewYOffset = scrollOffset; }

Todavía no funciona con el método stoppedScrolling , publicaré una actualización cuando lo tenga


Una forma de lograr esto es la siguiente.

Registre su controlador de vista para ser el UIScrollViewDelegate de su UITableView por ejemplo.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

Desde dentro de los métodos de UIScrollViewDelegate puede obtener el nuevo contentOffset y traducir su UINavigationBar hacia arriba o hacia abajo en consecuencia.

La configuración del alfa de las subvistas también se puede hacer en función de algunos valores de umbral y factores que puede establecer y calcular.

¡Espero eso ayude!


iOS8 incluye propiedades para ocultar la barra de navegación de forma gratuita. Hay un video de WWDC que lo demuestra, busque "Ver avances del controlador en iOS 8".

Ejemplo :

class QuotesTableViewController: UITableViewController { override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) navigationController?.hidesBarsOnSwipe = true }

}

Otras propiedades:

class UINavigationController : UIViewController { //... truncated /// When the keyboard appears, the navigation controller''s navigationBar toolbar will be hidden. The bars will remain hidden when the keyboard dismisses, but a tap in the content area will show them. @availability(iOS, introduced=8.0) var hidesBarsWhenKeyboardAppears: Bool /// When the user swipes, the navigation controller''s navigationBar & toolbar will be hidden (on a swipe up) or shown (on a swipe down). The toolbar only participates if it has items. @availability(iOS, introduced=8.0) var hidesBarsOnSwipe: Bool /// The gesture recognizer that triggers if the bars will hide or show due to a swipe. Do not change the delegate or attempt to replace this gesture by overriding this method. @availability(iOS, introduced=8.0) var barHideOnSwipeGestureRecognizer: UIPanGestureRecognizer { get } /// When the UINavigationController''s vertical size class is compact, hide the UINavigationBar and UIToolbar. Unhandled taps in the regions that would normally be occupied by these bars will reveal the bars. @availability(iOS, introduced=8.0) var hidesBarsWhenVerticallyCompact: Bool /// When the user taps, the navigation controller''s navigationBar & toolbar will be hidden or shown, depending on the hidden state of the navigationBar. The toolbar will only be shown if it has items to display. @availability(iOS, introduced=8.0) var hidesBarsOnTap: Bool /// The gesture recognizer used to recognize if the bars will hide or show due to a tap in content. Do not change the delegate or attempt to replace this gesture by overriding this method. @availability(iOS, introduced=8.0) unowned(unsafe) var barHideOnTapGestureRecognizer: UITapGestureRecognizer { get } }

Encontrado a través de http://natashatherobot.com/navigation-bar-interactions-ios8/


HidingNavigationBar un gran proyecto que oculta la barra de navegación y la barra de pestañas si lo desea.

HidingNavigationBar admite ocultar / mostrar los siguientes elementos de vista:

UINavigationBar

UINavigationBar y una extensión UIView

UINavigationBar y una UIToolbar

UINavigationBar y una UITabBar

HidingNavigationBar