Transición entre una barra de navigation transparente y translúcida.

En la aplicación remota recientemente lanzada de Apple, noté que la forma en que se comporta la barra de navigation es única y no he podido reproducirla. Al abrir el controller de vista Now Playing, la barra de navigation permanece transparente para el controller de vista Now Playing y la barra de navigation para el controller de vista de biblioteca también se mantiene translúcida (Captura de pantalla 1). Estoy tratando de averiguar si están usando dos controlleres de navigation o solo uno. Personalmente creo que están usando solo uno por dos razones (1) el gesto pop interactivo está habilitado; (2) cuando presiona el button 'Now Playing' en el controller de vista de la biblioteca, justo antes de que la pantalla que se está reproduciendo finalice la animation 'push view controller', la barra de navigation se vuelve transparente (Captura de pantalla 2). Este es el comportamiento que experimento al presionar mi controller de vista (que establece la barra de navigation en transparente). Entonces mi pregunta es: ¿Cómo presenta Apple las dos barras de navigation de los dos controlleres de vista como si fueran individuales (como en la Captura de pantalla 1), incluso los botones de barra, título de navigation, etc. … son 100% opacos al cambiar (generalmente cuando al presionar / hacer estallar los botones y los títulos del controller de vista anterior, se desvanecen a medida que se presiona el nuevo controller). He intentado jugar con el color de tinte de barra en viewDidAppear y viewWillAppear en ambos controlleres de vista, pero no puede reproducir el mismo comportamiento y no puedo evitar que los botones de barra se desvanezcan.

¡Dios mío, espero haber explicado esto bien, me siento confundido al pensar en eso!

Captura de pantalla 1 (Popping): Captura de pantalla 1

Captura de pantalla 2 (empujando): Captura de pantalla 2

Acabo de download la aplicación para asegurarme. Se usan dos barras de navigation diferentes. Puedes ver esto usando el gesto pop interactivo. Observe cómo la barra de navigation en el controller de vista inferior se desliza hacia adentro y hacia afuera. Durante las transiciones normales de push y pop, los elementos de navigation se desvanecen dentro y fuera de la barra existente, mientras que la barra está estacionaria. Esto es lo que sucede hasta el momento en que se empuja el controller de vista que se está reproduciendo.

Si observa rápidamente, durante la animation del controller de vista que se está reproduciendo ahora, puede ver que la barra de navigation inferior desaparece.

Desde mi experiencia con el comportamiento de UIKit y lo que veo en la aplicación, esto es lo que creo que sucede:

album_vc = la parte inferior, controller de vista de list nowplaying_vc = el controller de vista superior

  • En la vista de nowplaying_vc , viewWillAppear:

    • Establezca la barra de navigation en oculta usando [self.navigationController setNavigationBarHidden:YES animated:YES]; . Como esto está en el bloque de animation, esto hará que la barra de navigation se deslice durante la animation push.
    • Establezca [UIApplication shanetworkingApplication].statusBarStyle = UIStatusBarStyleLightContent; Estoy bastante seguro de esto, porque noto que no hay animation en la transición de los styles de barra de estado. Simplemente se vuelve blanco.
  • En la vista de nowplaying_vc , viewWillDisappear:

    • Establezca la barra de navigation como se muestra utilizando [self.navigationController setNavigationBarHidden:NO animated:YES]; . Como esto está en el bloque de animation, esto hará que la barra de navigation se deslice durante la animation pop.
    • Establezca [UIApplication shanetworkingApplication].statusBarStyle = UIStatusBarStyleDefault; Nuevamente, observe cómo durante el gesto pop interactivo, la barra de estado simplemente cambia sin animation.

Para lograr el aspecto transparente de la barra de navigation de nowplaying_vc , puede usar una image vacía ( [UIImage alloc] ) con setBackgroundImage:forBarPosition:barMetrics:

Como la aplicación no gira, no podemos estar seguros si la barra de navigation en nowplaying_vc es parte de otro controller de navigation o simplemente una barra de navigation en la parte superior con una position de UIBarPositionTopAttached . Por lo que sabemos, no hay ni siquiera una barra de navigation allí, sino solo una vista de image de chevron atrás (el button de barra posterior está compuesto por una vista de image y un button).

Creo que el estilo de la barra de estado cambia en viewWillAppear: y viewWillDisappear: debido a la sensación no natural que hay durante el gesto pop interactivo. Recomendaría utilizar una transición animada, o mejor aún, utilizar el nuevo estilo de barra de estado basado en el controller de vista, que el sistema anima las transiciones por sí mismo.

En lugar de ocultar y mostrar la barra de navigation, puede actualizar el alpha para la barra de navigation. Se animará suavemente durante la transición. Para el controller de vista con barra de navigation transparente, en lugar de modificar la barra de navigation, cree manualmente una barra de navigation (o simplemente el button de retroceso y título, etc.) en la vista del segundo controller. Luego ocultaremos la barra de navigation al pasar del primer controller de vista al segundo.

En la vista de su primer controller, viewWillDisappear y en la vista de su segunda vista del controller, viewWillAppear: establezca la barra de navigation alfa en cero utilizando self.navigationController.navigationBar.alpha = 0; . Como esto está en el bloque de animation, esto hará que la barra de navigation desaparezca durante la animation de inserción.

Establezca el alfa de nuevo en uno en la vista del primer controller. viewWillAppear y la segunda vista del controller viewWillDisappear .