custom bar uinavigationbar uitabbar uitoolbar appearance

custom - UINavigationBar apariencia actualizar?



uibarbuttonitem (3)

En mi aplicación iPad tengo una vista de configuración de la aplicación. Una de las opciones permite al usuario cambiar la combinación de colores de la interfaz. La vista de configuración se carga segue en un controlador de vista separado que la ventana de mi aplicación "principal".

Cuando eligen un nuevo color, cambio la variable colorSchemeColor y hago esto:

// set the colors and refresh the view [[UINavigationBar appearance] setBarTintColor:colorSchemeColor]; [[UIToolbar appearance] setBarTintColor:colorSchemeColor]; [[UITabBar appearance] setBarTintColor:colorSchemeColor];

Sin embargo, ¡ninguna de las barras cambia de color hasta que salgo de la vista de configuración! (Cuando la ventana de configuración desaparece, los colores de la aplicación "principal" cambian correctamente)

Entonces intenté poner este código justo después de actualizar la vista de configuración:

[self.view setNeedsDisplay]; [self.view setNeedsLayout];

lo cual no ayudó Así que agregué esto también:

[self.navigationController.view setNeedsDisplay]; [self.navigationController.view setNeedsLayout];

Esto tampoco funcionó.

¿Cómo puedo hacer que mi vista de configuración se "vuelva a dibujar" cuando se selecciona el nuevo color para que el cambio sea obvio al instante?

¡Muchas gracias!


C objetivo:

self.navigationController.navigationBarHidden = YES; self.navigationController.navigationBarHidden = NO;

Rápido:

self.navigationController?.isNavigationBarHidden = true self.navigationController?.isNavigationBarHidden = false


El proxy de apariencia solo afecta el aspecto de las vistas recién inicializadas. La configuración de colores en el proxy de apariencia no tendrá efecto en las barras de navegación que ya están visibles.

Tendrá que actualizar manualmente su vista actual; por ejemplo:

self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor;


Si bien creo que la respuesta de Aaron Brager es la estrategia ideal, mi aplicación necesita aproximadamente 15 configuraciones de apariencia diferentes y utiliza un controlador de vista dividida, por lo que tengo que volver a aplicar todas las configuraciones a la apariencia global y luego aplicarlas a mis dos vistas mostradas. Eso es mucho código redundante.

Basado en la idea de que presentar y descartar un controlador de vista modal obliga a que todo lo que hay debajo se vuelva a dibujar, lo intenté y funcionó perfectamente:

UIViewController *redrawTrigger = [[UIViewController alloc] init]; redrawTrigger.modalPresentationStyle = UIModalPresentationFullScreen; [mySplitViewController presentModalViewController:redrawTrigger animated:FALSE]; [mySplitViewController dismissModalViewControllerAnimated:FALSE]; [redrawTrigger release];