web-dev-qa-db-fra.com

iOS change la police et la couleur du titre de la barre de navigation

Donc, j'ai ce code qui devrait changer la police du titre de la barre de navigation, mais il fait

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
                                                                       fontWithName:_dataManager.optionsSettings.fontString size:14], NSFontAttributeName,
                            [UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

Changer la police du bouton retour avec ce code fonctionne très bien.

   //set backbutton font
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,
                                  nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
                                            forState:UIControlStateNormal];
98
aZtraL-EnForceR

La bonne façon de changer la police du titre (et sa couleur) est la suivante:

[self.navigationController.navigationBar setTitleTextAttributes:
 @{NSForegroundColorAttributeName:[UIColor redColor],
NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21]}];

Édition: Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.red,
 NSAttributedString.Key.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Édition: Swift 4

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedStringKey.foregroundColor: UIColor.red,
 NSAttributedStringKey.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Swift 3:

self.navigationController?.navigationBar.titleTextAttributes = 
[NSForegroundColorAttributeName: UIColor.redColor(),
 NSFontAttributeName: UIFont(name: "mplus-1c-regular", size: 21)!]
230
Brian

Il n'y a rien de mal avec les autres réponses. Je partage juste la version du storyboard pour définir la police.

1. Sélectionnez votre barre de navigation dans votre contrôleur de navigation

navbar

2. Modifier la police du titre dans l'inspecteur d'attributs

title-font

(vous devrez probablement basculer la teinte des barres pour la barre de navigation avant que Xcode ne récupère la nouvelle police)

Notes (mises en garde)

Vérifié que cela fonctionne sur Xcode 7.1.1+. ( Voir les exemples ci-dessous )

  1. Vous devez activer la teinte de la barre de navigation avant que la police ne prenne effet (cela ressemble à un bogue dans Xcode; vous pouvez le rétablir par défaut et la police restera en place)
  2. Si vous choisissez une police système ~ Assurez-vous que sa taille n'est pas égale à 0.0 (sinon, la nouvelle police sera ignorée)

size

  1. On dirait que cela fonctionne sans problème lorsqu'un seul NavBar est dans la hiérarchie des vues. Il semble que les barres de navigation secondaires de la même pile soient ignorées. (Notez que si vous affichez la barre de navigation du contrôleur de navigation principal, tous les autres paramètres de barre de navigation personnalisés sont ignorés).

Gotchas (deux)

Certaines d'entre elles sont répétées, ce qui signifie qu'elles méritent d'être signalées.

  1. Parfois, le XML Storyboard est corrompu. Cela nécessite que vous examiniez la structure dans Storyboard en mode Code source (cliquez avec le bouton droit sur le fichier de storyboard> Ouvrir en tant que ...).
  2. Dans certains cas, la balise navigationItem associée à l'attribut d'exécution défini par l'utilisateur a été définie en tant qu'enfant xml de la balise view au lieu de la balise du contrôleur de vue. Si c'est le cas, retirez-le d'entre les balises pour un fonctionnement correct.
  3. Basculez la teinte NavBar pour vous assurer que la police personnalisée est utilisée.
  4. Vérifiez le paramètre de taille de la police sauf si vous utilisez un style de police dynamique.
  5. Afficher la hiérarchie remplacera les paramètres. Il semble qu'une police par pile est possible.

Résultat

navbar-italic

Des échantillons

Gestion des polices personnalisées

Remarque ~ A Belle liste de contrôle peut être trouvé sur le site Web Code With Chris et vous pouvez voir un exemple de projet de téléchargement.

Si vous avez votre propre police et que vous voulez l'utiliser dans votre story-board, il existe un ensemble décent de réponses sur ce qui suit SO Question . Une réponse identifie ces étapes.

  1. Obtenez votre fichier de police personnalisé (.ttf, .ttc)
  2. Importez les fichiers de police dans votre projet Xcode
  3. Dans la liste app-info.plist, ajoutez une clé nommée Fonts fournie par application. C'est un type de tableau, ajoutez tous vos noms de fichiers de polices au tableau, remarque: y compris l'extension du fichier.
  4. Dans la barre de navigation de la barre de navigation, allez à l'inspecteur d'attributs, cliquez sur le bouton droit de l'icône de la zone de sélection de police. Dans le panneau contextuel, choisissez Police à personnaliser, puis choisissez le nom de la famille dans laquelle vous avez été incorporé.

Contournement des polices personnalisées

Donc, Xcode semble naturellement pouvoir gérer les polices personnalisées sur UINavigationItem, mais cette fonctionnalité ne se met pas à jour correctement (la police sélectionnée est ignorée).

UINavigationItem

Pour contourner ce problème:

Une solution consiste à résoudre le problème en utilisant le storyboard et en ajoutant une ligne de code: Tout d'abord, ajoutez un UIView (UIButton, UILabel ou une autre sous-classe UIView) au contrôleur de vue (pas à l'élément de navigation ... Xcode ne permet pas actuellement de le faire. cette). Après avoir ajouté le contrôle, vous pouvez modifier la police dans le storyboard et ajouter une référence en tant que sortie à votre View Controller. Attribuez simplement cette vue à UINavigationItem.titleView. Vous pouvez également définir le nom du texte dans le code si nécessaire. Bug signalé (23600285).

@IBOutlet var customFontTitleView: UIButton!

//Sometime later...    
self.navigationItem.titleView = customFontTitleView
51
Tommie C.

Essaye ça:

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;
21
Akki

Mon code Swift pour modifier le titre de la barre de navigation:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
self.navigationController.navigationBar.titleTextAttributes = attributes

Et si vous souhaitez également modifier la police d'arrière-plan, voici ce que j'ai dans mon AppDelegate:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)
13
Libor Zapletal

Voici une réponse à votre question:

Déplacez votre code vers la méthode ci-dessous car le titre de la barre de navigation est mis à jour après l'affichage chargé. J'ai essayé d'ajouter du code ci-dessus dans viewDidLoad ne fonctionne pas, cela fonctionne très bien dans la méthode viewDidAppear.

  -(void)viewDidAppear:(BOOL)animated{}
4
Praveen Hiremath

Tout le monde a besoin d'une version Swift 3. redColor() n'est plus que red.

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]
3
Karl Taylor

Rapide:-

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]
2
karthik

J'ai eu un problème parce que lorsque j'ai essayé de changer mon titre NavigationItem par programmation, je n'ai pas pu trouver la police de ma famille (j'ai essayé beaucoup de choses, mais impossible de le faire fonctionner correctement). J'ai donc trouvé une solution de contournement très agréable et facile dans le storyboard.

  1. Tout d'abord, vous ajoutez sous l'élément de navigation une vue au milieu et n'oubliez pas de définir la propriété backGroundColor sur clear color pour qu'elle ait la même couleur que navBar:

enter image description here

  1. Ensuite, vous ajoutez une étiquette que vous pouvez éditer (définir la couleur du texte, la police, la taille ...) dans cette vue.
  2. Vous ajoutez des contraintes à l'étiquette (haut = 0, bas = 0, tirant = 0 et en tête = 0) pour afficher et centrer le texte de l'étiquette

Enfin, vous devriez avoir quelque chose comme ça dans le plan du document:

enter image description here

Et quelque chose comme ça dans votre ViewController:

enter image description here

J'espère que ça peut aider.

2
O. Boujaouane

C'est un peu plus lisible en utilisant des littéraux:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };
2
sPoz

AJOUTEZ ce code de ligne unique dans votre délégué d’application - Lancement de Didfinish. Il changera la police, la couleur de la barre de navigation de l’application.

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]
2
Renish Dadhaniya

iOS 11

enter image description here

Objectif c

if (@available(iOS 11.0, *)) {
    self.navigationController.navigationItem.largeTitleDisplayMode =  UINavigationItemLargeTitleDisplayModeAlways;
    self.navigationController.navigationBar.prefersLargeTitles = true;

// Change Color
    self.navigationController.navigationBar.largeTitleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};

} else {
    // Fallback on earlier versions
}
1
Vivek

Pour que Objective-C définisse la police et la couleur

- (void)_setup {
    NSDictionary *barButtonTitleAttributes = @{
                                               NSForegroundColorAttributeName : [UIColor whiteColor],
                                               NSFontAttributeName :[UIFont fontWithName:@"Lato-Regular" size:15.0]
                                               };
    [self.navigationBar setTitleTextAttributes:barButtonTitleAttributes];

}
1
Hardik Thakkar

Celui-ci comme alternative à Swift 4 (répondez déjà par @Josh):

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed
1
Hendra Kusumah

N'oubliez pas d'ajouter les valeurs brutes des clés pour éviter les erreurs de compilation.

    let textAttributes:[NSAttributedStringKey: Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue):UIColor.blue, NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue):UIFont(name:"OpenSans", size: 17)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
0
James Rochabrun

Voici une réponse pour Swift 4 ????:

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
0
Josh

Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]
0
ilkayaktas

Ajouter cette extension

extension UINavigationBar {
    func changeFont() {
        self.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Poppins-Medium", size: 17)!]
    }
}

Ajouter la ligne suivante dans viewDidLoad ()

self.navigationController?.navigationBar.changeFont()
0
Pranit