solid color bar ios swift uinavigationbar ios11.2

ios - color - set navigation bar swift



El botón UINavigationBar de iOS permanece desteñido después de segue volver (4)

Este es un error en iOS 11.2 y ocurre porque UIBarButtonItem permanece resaltado después de la navegación y no vuelve a su estado normal después de que aparece el otro controlador de vista.

Para evitar este comportamiento, ya sea

  1. utilizar un UIBarButtonItem con un UIButton como una vista personalizada

  2. deshabilite y vuelva a habilitar el elemento del botón de barra en viewWillDisappear(_:) (aunque esto hace que el botón aparezca inmediatamente, use la solución de matt para evitar esto):

    barButtonItem.isEnabled = false barButtonItem.isEnabled = true

En mi aplicación tengo múltiples controladores de visualización, y la mayoría tiene un UIBarButtonItem lado UIBarButtonItem con UIBarButtonItem "show" directas adjuntas.

Después de pasar a otra vista y luego presionar el botón ''< Back'' , el elemento del botón original permanece desvanecido, aunque de todos modos se puede utilizar.

Esto solo parece suceder en iOS 11.2.

No puedo ver ninguna configuración que podría estar haciendo esto, y en al menos uno de los casos en que esto sucede, no hay un desenrollado de segue específico ni el manejo de viewDidAppear . Publicaba un código, pero AFAICS es solo el comportamiento predeterminado de UINavigationBar .


Lo que hago es viewWillAppear este error, en la vista del controlador de vista viewWillAppear , de la siguiente manera:

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.tintAdjustmentMode = .normal self.navigationController?.navigationBar.tintAdjustmentMode = .automatic }

Eso parece despertar el botón sin artefactos visuales.


Lo solucioné así:

override func viewWillDisappear(_ animated: Bool) { navigationController?.navigationBar.tintAdjustmentMode = .normal navigationController?.navigationBar.tintAdjustmentMode = .automatic }

por lo que restaurará el color antes de que aparezca la otra vista


Otra alternativa es implementar la corrección en el control de navegación padre, de modo que cada uno de sus viewControllers secundarios obtenga la solución de la siguiente manera

NOTA: Esto requiere que la clase de recepción se configure como el delegado UINavigationController

Rápido

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { if #available(iOS 11.2, *) { navigationBar.tintAdjustmentMode = .normal navigationBar.tintAdjustmentMode = .automatic } }

C objetivo

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (@available(iOS 11.2, *)) { self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal; self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic; } }