guidelines color bar ios uinavigationcontroller ios7 uinavigationbar

color - La pila de navegación se vuelve inutilizable después de cancelar el movimiento de desplazamiento posterior de iOS 7



navigation controller programmatically swift (4)

Estoy encontrando un problema en el que mi controlador de navegación se vuelve inutilizable después de iniciar y luego cancelar el nuevo gesto de desplazamiento de iOS 7.

Algunos datos relevantes:

  • Mi aplicación tiene una página de inicio con varias páginas de actividad.
  • La página de inicio oculta la barra de navegación en viewWillAppear
  • La página de inicio muestra la barra de navegación en viewWillDisappear

    -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Let''s hide the navbar when we show the home view [self.navigationController setNavigationBarHidden:YES]; … } -(void) viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; // Let''s hide the navbar when we show the home view [self.navigationController setNavigationBarHidden:NO]; }

Cuando un usuario toca un icono de actividad en la página de inicio, el controlador de vista de la actividad se coloca en la pila.

Si un usuario comienza a usar el nuevo gesto de desplazamiento hacia atrás en iOS pero luego detiene el gesto (es decir, decide no regresar), todo se ve bien. Sin embargo, si un usuario hace que otro controlador de vista sea empujado en la pila de navegación, la barra de errores se vuelve inutilizable y el usuario no puede navegar hacia atrás desde el controlador de vista actual.

Notas

  • Solo sucede cuando muestro / oculto la barra de navegación.
  • Todavía puedo realizar el gesto hacia atrás lentamente y todo funcionará bien siempre y cuando no cancele el gesto.
  • La barra de navegación parece que funcionará, pero presionar el botón Atrás no abre el controlador de vista.

Creo que mi solución puede ayudarte.

Supongamos que la clase de su controlador de vista de la página de inicio es HomePageViewController (nombre de clase), y el controlador de vista de actividad se llama ActivityViewController (nombre de clase, también)

Primero, en la vista de HomePageViewController, aparecerá:

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES]; }

En segundo lugar, en su ActivityViewController, agregue estos códigos:

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:NO animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { //trick to fix navigationbar disappear problem that when UIScreenEdgePanGesture is happening. if ([self.navigationController.topViewController isKindOfClass:[HomePageViewController class]]) { [self.navigationController setNavigationBarHidden:YES animated:YES]; } else { [self.navigationController setNavigationBarHidden:NO animated:YES]; } [super viewWillDisappear:animated]; }


No estoy seguro de si ya resolviste esto pero estoy enfrentando el mismo problema pero con una diferencia. La pila de navegación solo se desordena si configuroAnimado en NO.

Así que esto funciona:

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

pero esto no lo hace

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

Si realmente quieres que la animación sea NO por cualquier razón, una solución es establecer alfa en 0/1 en lugar de ocultar / mostrar la barra de navegación:

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.navigationBar.alpha = 0.0f; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController.navigationBar setAlpha:1.0f]; }

El inconveniente es que no hay una buena animación de transición de diapositiva a ventana. Si encontraste una manera mejor, háznoslo saber.

ACTUALIZACIÓN : Esto ya es antiguo, pero resolví mi problema al no garantizar que el estado que se cambia en la vista actual se desencadenará, se restaurará en viewWillAppear. No derribes las cosas a la vista. Aparecerá una pantalla que no podrás volver a configurar.

Esto es lo que sucede cuando cancelas la animación pop:

  1. Vista actual
  2. Nuevo viewWillAppear
  3. [cancelado ... invierte]
  4. Nueva vistaDesaparecerá
  5. Nuevo viewDidDisappear
  6. Vista actualWillAppear
  7. Vista actualDidAppear

Supongo que en este mundo nuevo y valiente, ver "Desaparecerá" / "Ver" Aparecerá "No siempre significa que la vista" desaparecerá "/ aparecerá"


Pude resolver este problema usando animated: true en viewWillAppear y animated: false en viewWillDisappear del viewWillDisappear de la segunda vista


Tuve el mismo problema, y ​​después de buscar, parece que no se puede recibir una notificación si se cancela el gesto. No hay -shouldCancel en el delegado del reconocedor de gestos, y no hay -willReshowViewController en el controlador de navegación. Por lo tanto, tengo el controlador de vista que necesita que se muestre la barra de navegación (es decir, el controlador que se está cancelando) configurado self.navigationController.navigationBarHidden = NO in -viewWillAppear . De esa forma, cuando se cancele el gesto y se -viewWillAppear , la barra de navegación volverá a aparecer. Por lo que puedo decir, esta es la única forma de tener el gesto de barrido hacia atrás y las barras de navegación mostradas / ocultas sin ningún problema al cancelar el gesto.