web-dev-qa-db-fra.com

Changer la police du bouton de la barre de navigation arrière

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.).

47
zachjs

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) 
114
Mike Pollard

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.

6
PeterK

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

4
Vexy

Swift 3.0 +

AppDelegate.Swift

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "myFont", size: 17.0)!], for: .normal)
2
smohn

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.

2
Vincent

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]; 
1
Ahmed Z.

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