J'utilise ce code pour changer la couleur de teinte de l'élément dans la barre de navigation:
UINavigationBar.appearance().tintColor = theme.labelColor
Toutefois, cela ne fonctionne plus sous iOS 11. Avant iOS 11, les boutons de la barre de navigation étaient UINavigationButton
s, mais dans iOS 11, ils ont été remplacés par _UIModernBarButton
. J'ai pu changer leur couleur de teinte avec UIButton.appearance().tintcolor
, mais cela change chaque bouton.
Voici une comparaison:
Quelqu'un sait-il comment changer la couleur de teinte des boutons dans la barre de navigation?
UPDATE 01/09/2017: On dirait que _UIButtonBarButton
a la teinte correcte, mais _UIModernBarButton
le remplace par la couleur définie pour UIButton
.
UPDATE 18/09/2017:
"L’ingénierie a fourni les commentaires suivants sur ce problème:
UIView.tintColor n'est pas un sélecteur d'apparence, et est spécifiquement documenté comme ne fonctionnant pas correctement comme une propriété d'apparence en raison de ses propriétés d'héritage. "
J'ai donc trouvé une solution. Je règle la couleur de teinte via le proxy d’apparence pour UIButton, mais uniquement s’il est contenu dans un UINavigationBar. Cela ressemble à cela fonctionne pour moi. Cependant, j'espère toujours que ce comportement changera dans iOS 11 GM ou que quelqu'un pourra proposer une meilleure solution. Voici mon code de travail:
if([UIButton respondsToSelector:@selector(appearanceWhenContainedInInstancesOfClasses:)]) {
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]]setTintColor:navTintColor];
}
Version Swift de l'appel de proxy d'apparence:
UIButton.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = UIColor.red
Merci beaucoup pour toutes ces bonnes réponses. Pour moi, cela a fait l'affaire:
[[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];
Nous avons une couleur personnalisée pour tous nos UIButton
s dans l'application (en utilisant [[UIButton appearance] setTintColor:]
. Ce faisant, nous ne pourrions jamais changer la tintColor
de toute UIBarButtonItem
(y compris le bouton Précédent) sur iOS 11. J'avais essayé de définir la tintColor
sur UINavigationBar
jusqu'au J'avais le visage bleu: je n'y ai rien trouvé, puis j'ai trouvé cette question SO qui m'a finalement orientée dans la bonne direction (merci!).
Le truc est le suivant: réglez la UIButton
de tintColor
sur nil
quand elle est contenue dans une UINavigationBar
. De cette façon, la teinteCouleur de la UINavigationBar
sera transmise à la UIBarButtonItem
et tout fonctionnera comme prévu.
Maintenant, dans ma méthode viewWillAppear:
, je peux simplement faire ceci:
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
et tous mes UIBarButtonItem
s, y compris le bouton de retour, sont blancs.
Vous pourriez faire
[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];
cela fonctionne, mais vous êtes picotant avec une classe privée ( cela ne vous fera cependant pas être rejeté )
vous pouvez également avoir votre propre sous-classe UINavigationController et l’utiliser uniquement lorsque vous en avez besoin.
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];
J'ai eu le même problème avec le bouton de retour dans la barre de navigation n'étant pas la couleur que j'ai définie pour UINavigationBar avec:
[[UINavigationBar appearance] setBackgroundColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setBarTintColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setTintColor:COLOR_NAVIGATION_FOREG];
Enfin je suis arrivé à la solution avec:
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:COLOR_NAVIGATION_FOREG];
Cette ligne définit la couleur du bouton de navigation.
J'ajouterais également que si vous modifiez la police du bouton de navigation, vous devez ajouter une ligne pour modifier la couleur du texte:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSFontAttributeName:FONT_MAIN_NAVIGATION} forState:UIControlStateNormal];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSForegroundColorAttributeName:COLOR_NAVIGATION_FOREG} forState:UIControlStateNormal];