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
utilizar un
UIBarButtonItem
con unUIButton
como una vista personalizadadeshabilite 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;
}
}