web-dev-qa-db-fra.com

Modification de la couleur de teinte des éléments dans UINavigationbar (iOS 11)

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 UINavigationButtons, 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:

 iOS 10 Vs. 11 UINavigationBar button 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. "

19
Dan

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
16
dehlen

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 UIButtons 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 UIBarButtonItems, y compris le bouton de retour, sont blancs.

1

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]];
0
Peter Lapisu

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];
0
schmru