color change bar swift uibutton uinavigationbar uibarbuttonitem ios11

swift - change - Cambio del color del tinte de los elementos en UINavigationbar(iOS 11)



swift 4 navigation bar title color (4)

He estado usando este código para cambiar el color del tinte del elemento en la barra de navegación:

UINavigationBar.appearance().tintColor = theme.labelColor

Sin embargo, esto ya no funciona en iOS 11. Antes de iOS 11, los botones en la barra de navegación eran UINavigationButton s, pero en iOS 11 se han cambiado a _UIModernBarButton . Pude cambiar su color de tinte con UIButton.appearance().tintcolor , pero eso cambia cada botón.

Aquí hay una comparación:

¿Alguien tiene alguna idea de cómo cambiar el color del tinte de los botones en la barra de navegación?

ACTUALIZACIÓN 01/09/2017: Parece que _UIButtonBarButton tiene el color de tinte correcto, pero _UIModernBarButton sobrescribe con el color establecido para UIButton .

ACTUALIZACIÓN 18/09/2017:

"Ingeniería ha proporcionado los siguientes comentarios con respecto a este problema:

UIView.tintColor no es un selector de apariencia, y se documenta específicamente que no funciona correctamente como una propiedad de apariencia debido a sus propiedades de herencia ".


Así que encontré una especie de solución. Estoy configurando el color de tinte a través del proxy de apariencia para UIButton pero solo cuando está contenido en una barra de UINavigation. Esto parece que está funcionando para mí. Sin embargo, aún espero que este comportamiento cambie en el iOS 11 GM o que alguien pueda encontrar una mejor solución. Aquí está mi código de trabajo:

if([UIButton respondsToSelector:@selector(appearanceWhenContainedInInstancesOfClasses:)]) { [[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]]setTintColor:navTintColor]; }

Swift versión de apariencia llamada de proxy:

UIButton.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = UIColor.red


Muchas gracias por todas estas grandes respuestas. Para mí, esto hizo el truco:

[[UIButton appearance] setTintColor:someDefaultColorForAllButtons]; /** * Starting with iOS 11, UIBarButtonItems actually have a UIButton subview. * That means that the [UIButton appearance]''s tintColor will override whatever * tintColor would normally be set or passed-through to the barButtonItem (usually * the UINavigationBar''s tintColor). That''s why we un-set the tintColor for * UIButton when it''s contained in an instance of UINavigationBar. */ [[UIButton appearanceWhenContainedIn:UINavigationBar.class, nil] setTintColor:nil];

Tenemos un color personalizado para todos nuestros UIButton s en la aplicación (usando [[UIButton appearance] setTintColor:] . Al hacerlo, nunca podríamos cambiar el tintColor de ningún UIBarButtonItem (incluido el botón Atrás) en iOS 11. para establecer el tintColor en una UINavigationBar tintColor de UINavigationBar hasta que me puse de color azul en la cara: todo fue en vano. Luego encontré esta pregunta SO y finalmente me indicó la dirección correcta (¡gracias!).

El truco es este: establece el UIButton del tintColor en nil cuando está contenido en una UINavigationBar . De esa manera, el UINavigationBar de UINavigationBar se pasará al UIBarButtonItem y todo funcionará como se espera.

Ahora, en mi viewWillAppear: método puedo simplemente hacer esto:

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

y todos mis artículos UIBarButtonItem , incluido el botón Atrás, son blancos.


Podrías hacerlo

[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];

esto funciona, pero estás hormigueando con una clase privada ( sin embargo, esto no hará que te rechacen )

También puede tener su propia subclase UINavigationController y usarla solo donde lo necesite.

[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];


Tuve el mismo problema con el botón Atrás en la barra de navegación, no siendo el color que configuré para UINavigationBar con:

[[UINavigationBar appearance] setBackgroundColor:COLOR_NAVIGATION_BG]; [[UINavigationBar appearance] setBarTintColor:COLOR_NAVIGATION_BG]; [[UINavigationBar appearance] setTintColor:COLOR_NAVIGATION_FOREG];

Finalmente llegué a la solución con:

[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:COLOR_NAVIGATION_FOREG];

Esta línea establece el color del botón de navegación.

También agregaría que si cambia la fuente del botón de navegación, debe agregar una línea para cambiar el color del texto:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSFontAttributeName:FONT_MAIN_NAVIGATION} forState:UIControlStateNormal]; [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSForegroundColorAttributeName:COLOR_NAVIGATION_FOREG} forState:UIControlStateNormal];