J'utilise UIAppearance pour appliquer des polices à UINavigationBar et UIBarButtonItem et j'ai des problèmes. J'ai exécuté ce code:
[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil]
setTitleTextAttributes:
@{NSFontAttributeName : [UIFont fontWithName:@"My_Font" size:17.0]}
forState:UIControlStateNormal];
NSLog(@"%@", [[UIBarButtonItem appearanceWhenContainedIn:
[UIToolbar class], nil] titleTextAttributesForState:UIControlStateNormal]);
et le résultat de ce journal sur iOS 7 est:
(null)
Où le résultat dans iOS 6 est:
{
NSFont = "<UICFFont: 0x1d897a80> font-family: \"My_Font\"; font-weight: normal; font-style: normal; font-size: 17px";
}
Je ne trouve rien dans les documents iOS 7 qui indiquerait que cela ne devrait pas fonctionner, quelqu'un d'autre a-t-il eu ce problème?
Modifier 1
En fait, je l'ai fait fonctionner avec [UINavigationBar appearance]
le problème était que je mettais la taille du point à 0 pour que la police soit définie sur la taille par défaut navbar/barButtonItem comme décrit dans NSString UIKit Additions Reference mais cela ne fonctionne apparemment plus dans iOS 7. Au lieu de cela, la définition de la taille du point à 0 renvoie la police système.
Je ne parviens toujours pas à définir titleTextAttributes
sur
[UIBarButtonItem appearanceWhenContaintedIn:[UIToolbar class], nil]]
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
fontWithName:@"YOURFONT" size:14], NSFontAttributeName,
[UIColor whiteColor], NSForegroundColorAttributeName, nil];
[[UINavigationBar appearance] setTitleTextAttributes:attributes];
La clé est d'utiliser NSFontAttributeName et ainsi de suite. Je suppose qu'ils passent à l'utilisation de la variété NS pour la compatibilité 64 bits. Le code ci-dessus a fonctionné sur mon appareil iOS7.
Suite à la réponse de @Alex Zavatone - cela pourrait être bien fait en une seule ligne de code:
self.navBar.titleTextAttributes = @{
NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0],
NSForegroundColorAttributeName: [UIColor redColor]
};
Cela a bien fonctionné pour iOS 7 lorsque je l'ai déplacé vers une méthode viewDidLoad dans mon contrôleur de vue.
[[UIBarButtonItem appearance] setTitleTextAttributes:attributes];
Lorsque j'ai essayé de le faire dans AppDelegate, cela n'a pas fonctionné, cependant[[UINavigationBar appearance] setTitleTextAttributes:setTitleTextAttributes:attributes];
a bien fonctionné dans AppDelegate. Il doit également aller avant de créer et d'attribuer le bouton de barre.
Il fonctionne également à partir de la méthode initWithCoder si vous créez votre bouton de barre sur Storyboard.
pdate: Si vous modifiez la cible de déploiement en 7.0, Xcode vous fournira des avertissements indiquant que, par exemple, UITextAttributeTextColor est obsolète et que vous devez utiliser NSForegroundColorAttributeName ou au lieu de UITextAttributeFont, utilisez NSFontAttributeName. Après avoir modifié les constantes d'attribut, vous pouvez appeler setTitleTextAttributes: depuis AppDelegate.
Voici ce que je fais sur iOS-7
UIColor *red = [UIColor colorWithRed:165.0f/255.0f green:1.0f/255.0f blue:0.0f/255.0f alpha:1.0];
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Light" size:24.0f];
NSMutableDictionary *navBarTextAttributes = [NSMutableDictionary dictionaryWithCapacity:1];
[navBarTextAttributes setObject:font forKey:NSFontAttributeName];
[navBarTextAttributes setObject:red forKey:NSForegroundColorAttributeName ];
self.navBar.titleTextAttributes = navBarTextAttributes;
Le voici en Swift:
let font = UIFont(name: "My_Font", size: 17.0)
UINavigationBar.appearance().titleTextAttributes = [
NSForegroundColorAttributeName: UIColor.whiteColor(),
NSFontAttributeName: font!
]
* Notez que vous devez déballer l'UIFont en option.
Pour les UIBarButons, utilisez le proxy d'apparence :
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Helvetica Neue" size:fontSize], UITextAttributeFont,
nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
forState:UIControlStateNormal];
Si vous souhaitez limiter les UIBarButtonItems que votre style affecte, utilisez plutôt l'apparenceWhenContainedIn:.
Pour UINavigationBar, vous pouvez créer un UILabel et le définir sur votre navigationItem.titleView:
UIabel *title = [[UILabel alloc] initWithFrame:CGRectZero];
title.backgroundColor = [UIColor clearColor];
title.font = [*yourfont*];
title.textColor = [*your color*];
self.navigationItem.titleView = title;
Voici comment changer globalement la couleur du texte du titre de la barre de navigation dans Swift 4:
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.yellow]