objective-c swift uinavigationbar ios10

objective c - Navegación Retraso en la barra de actualización TintColor iOS10



objective-c swift (1)

Contexto:

Digamos que tenemos un NavigationController y 2 viewControllers. ViewControllerA tiene una ViewControllerA navegación azul, mientras que ViewControllerB tiene una verde.

Los configuré así:

override func viewWillAppear(_ animated: Bool) { self.navigationController?.navigationBar.barTintColor = UIColor.blue // Green if ViewController B }

Funciona bien cuando llegué de A a B, pero cuando regreso, el tinte de barra de navegación se actualiza después. Como si estuviera configurado en viewDidAppear .

Esperado:

La barra de navegación debe tener su color de barra de navegación actualizado sin demora.

Soluciones probadas:

  • He visto esta publicación SO y probé la solución. Funcionó, pero haría que la gestión de la barra de navegación fuera mucho más compleja y dolorosa. (en una aplicación real)

  • Intenté cambiar el tono de la barra de navegación en el método ViewWillDisappear . No funcionó

Más:

Esto es causado por un cambio en la API ios10. He leído las notas de la versión , pero aún no está claro qué se debe hacer en este caso.

En iOS 10, UIKit ha actualizado y unificado la gestión de fondo para UINavigationBar, UITabBar y UIToolbar. En particular, los cambios en las propiedades de fondo de estas vistas (como las imágenes de fondo o de sombra, o la configuración del estilo de barra) pueden iniciar un pase de diseño para que la barra resuelva la nueva apariencia de fondo.

En particular, esto significa que los intentos de cambiar la apariencia de fondo de estas barras dentro de layoutSubviews, - [UIView updateConstraints], viewWillLayoutSubviews, viewDidLayoutSubviews, updateViewConstraints, o cualquier otro método que se llame en respuesta al diseño puede dar como resultado un bucle de diseño.

En algunos casos, puede romper estos bucles de diseño asegurándose de usar siempre la misma instancia de objeto cuando se requieren objetos (como UIImage o UIColor). Pero, en general, debe evitar hacer esto.

Pregunta:

¿Cuál sería la mejor manera de manejar los cambios en la barra de navegación entre diferentes controladores de navegación en iOS 10?


Prueba este código:

Nota: Código probado en Swift 3.

En ViewController A:

override var isViewLoaded: Bool { title = "View 1" navigationController?.navigationBar.barTintColor = .blue navigationController?.navigationBar.isTranslucent = true navigationController?.navigationBar.tintColor = UIColor.white navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white] UIApplication.shared.statusBarStyle = .lightContent self.navigationController?.navigationBar.barStyle = .black // In case statusbar Light content wont work. return true }

En ViewController B:

override var isViewLoaded: Bool { title = "View 2" navigationController?.navigationBar.barTintColor = .green navigationController?.navigationBar.tintColor = .white navigationController?.navigationBar.isTranslucent = true navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white] return true }

Salida: sin demora alguna vez ...

Imagen de patrón como un TintColor.

En ViewController A:

navigationController?.navigationBar.barTintColor = UIColor(patternImage: UIImage(named: "viewOneImage.jpg")!)

En ViewController B:

navigationController?.navigationBar.barTintColor = UIColor(patternImage: UIImage(named: "viewTwoImage.jpg")!)

Salida: