Je veux pouvoir définir la police du bouton de retour de la barre de navigation de mes applications sans rien faire de trop fou et sans perdre d'autres caractéristiques de conception du bouton (c'est-à-dire que je veux garder la flèche).
En ce moment j'utilise ceci dans viewDidAppear:
pour définir la police des éléments de bouton de barre normaux.
for (NSObject *view in self.navigationController.navigationBar.subviews) {
if ([view isKindOfClass:[UIButton class]]) {
[((UIButton*)view).titleLabel setFont:[UIFont
fontWithName:@"Gill Sans"
size:14.0]];
}
}
Toutefois, cela n'apporte aucune modification au bouton Précédent, quel que soit UIViewController
auquel ce code est appliqué (racine, courant, etc.).
Pour modifier l'apparence du texte dans tous les UIBarButtonItems
apparaissant dans tous les UINavigationBars
, procédez comme suit dans application:didFinishLaunchingWithOptions:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:
@{UITextAttributeTextColor:[UIColor blackColor],
UITextAttributeTextShadowOffset:[NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
UITextAttributeTextShadowColor:[UIColor whiteColor],
UITextAttributeFont:[UIFont boldSystemFontOfSize:12.0]
}
forState:UIControlStateNormal];
MISE À JOUR: version conviviale iOS7
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowOffset = CGSizeMake(0.0, 1.0);
shadow.shadowColor = [UIColor whiteColor];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:
@{NSForegroundColorAttributeName:[UIColor blackColor],
NSShadowAttributeName:shadow,
NSFontAttributeName:[UIFont boldSystemFontOfSize:12.0]
}
forState:UIControlStateNormal];
Rapide:
REMARQUE: cela modifie TOUTES les instances de UIBarButtonItem
, pas seulement celles contenues dans un UINavigationBar
UIBarButtonItem.appearance()
.setTitleTextAttributes([NSFontAttributeName : ExamplesDefaults.fontWithSize(22)],
forState: UIControlState.Normal)
Swift3:
UIBarButtonItem.appearance()
.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FontName-Regular", size: 14.0)!],
for: .normal)
Pour tous ceux qui ne l'ont pas complètement fait fonctionner, voici comment je l'ai fait, y compris pour revenir au Root ViewController dans IOS7:
UIBarButtonItem *backBtn =[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleDone target:self action:@selector(popToRoot:)];
backBtn.title = @"Back";
[backBtn setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Chalkduster" size:15], NSFontAttributeName,
[UIColor yellowColor], NSForegroundColorAttributeName,
nil]
forState:UIControlStateNormal];
self.navigationItem.leftBarButtonItem=backBtn;
popToRoot ViewController:
- (IBAction)popToRoot:(UIBarButtonItem*)sender {
[self.navigationController popToRootViewControllerAnimated:YES];
}
Peut-être que quelqu'un pourrait l'utiliser.
Version rapide de tout ce qui est mentionné ci-dessus (extrait de la réponse originale ):
let customFont = UIFont(name: "customFontName", size: 17.0)!
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], forState: .normal)
Plus de goodies:
https://stackoverflow.com/a/28347428/469614
Swift 3.0 +
AppDelegate.Swift
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "myFont", size: 17.0)!], for: .normal)
Dans Swift3:
let font = UIFont(name: "Verdana", size: 10.0)
// Back button
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: font!], for: UIControlState.normal)
// Title in the navigation item
let fontAttributes = [NSFontAttributeName: font]
self.navigationController?.navigationBar.titleTextAttributes = fontAttributes
Remarque: vous ne devez effectuer cette opération qu'une seule fois pour le contrôleur de navigation.
Utilisez-le à la place dans votre AppDelegate ou là où le NavigationController est initialisé, méthode disponible dans iOS 5 et supérieur
UIBarButtonItem *backbutton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:nil action:nil];
[backbutton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor blackColor],UITextAttributeTextColor,[UIFont fontWithName:TEXTFONT size:16.0f],UITextAttributeFont,
nil] forState:UIControlStateNormal];
Si vous utilisez le nouveau ISplitViewControllerDelegate pour les vues fractionnées dans iOS 8, les méthodes ci-dessus ne fonctionneront pas car le nouveau displayModeButtonItem
fonctionne un peu différemment.
Vous devez définir la police lorsque vous créez le displayModeButtonItem
. En supposant que vous suivez les modèles d'Apple, c'est probablement dans prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
où vous feriez quelque chose comme ceci:
// From Apple's Template:
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController];
[controller setDetailItem:object];
controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
controller.navigationItem.leftItemsSupplementBackButton = YES;
// New Line to set the font:
[controller.navigationItem.leftBarButtonItem setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"SourceSansPro-Regular" size:14]} forState:UIControlStateNormal];