web-dev-qa-db-fra.com

Comment puis-je changer la police du bouton de retour de ma barre de navigation?

Comment puis-je changer la police du bouton de retour de ma barre de navigation.

Le bouton de retour est soit "retour", soit le titre du contrôleur de vue précédent.

Je pensais que ce viewDidLoad fonctionnerait:

navigationController?.navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: UIControlState.Normal)

mais le leftBarButton? facultatif renvoie nil.

35
Kyle Goslan

Je viens de tester votre code et il semble que la raison pour laquelle la ligne renvoie nil est en fait parce que name: "FONTNAME" renvoie zéro. Donc, si vous définissez cet attribut name sur un nom de police valide, le code doit s'exécuter sans erreur - même si navigationController?.navigationItem.leftBarButtonItem est explicitement défini sur nil.

Mais quoi qu'il en soit, comme je l'ai vu au cours des tests, cette ligne ne vous donnera pas le résultat que vous souhaitez apparemment. Le navigationController facultatif ne doit pas être là car il accède à votre UINavigationController et non à la vue actuelle. Utilisez simplement la propriété UIViewController de navigationItem pour accéder directement à sa leftBarButtonItem, par exemple:

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
navigationItem.leftBarButtonItem = backButton
navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)

Modifier : D'après le commentaire que vous avez publié sous cette réponse, il semble que vous ne souhaitiez pas réellement définir le leftBarButtonItem mais le backBarButtonItem parce que vous ne voulez pas implémenter une action personnalisée au-delà du retour au contrôleur de vue précédent.

Donc, dans ce contrôleur de vue précédent (c'est-à-dire la vue avant de montrer votre élément de bouton de retour personnalisé), vous pouvez définir votre bouton de retour personnalisé sans une action comme celle-ci:

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
backButton.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)
navigationItem.backBarButtonItem = backButton
29
Lyndsey Scott

Si vous devez modifier entièrement le style de police dans votre application (aka. Chaque bouton de navigation), la méthode préférée consiste à utiliser UIBarButtonItem.appearance() proxy .

Un exemple d'extrait de code ressemblerait à ceci:

Swift 3.0 +

//make sure font name u use below *actually* exists in the system !
//if it doesn't app will crash because we're force unwrapping an optional (see below) !!!
let customFont = UIFont(name: "customFontName", size: 17.0)!
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], for: .normal)

Il est judicieux de placer cet extrait de code quelque part au début de votre fichier AppDelegate.Swift, Car la stylisation de la police doit se produire à chaque lancement de l'application. En outre, vous êtes sûr de mettre ce code dans n'importe quel autre endroit (par exemple. Presenter class) où vous effectuez votre stylisation et personnalisation de l'interface utilisateur. Dès que ce code sera exécuté, tous vos BarButtons seront personnalisés par la suite.


[~ # ~] mais [~ # ~] comme un vrai Swift ????, vous devez d'abord éventuellement déballer votre police et éventuellement revenir à la police système si elle n'est pas trouvée ou tout autre problème possible survient lors du chargement de la police.

var textAttributes: [String:Any]

//custom font setup
let fontColor = UIColor.purple
let barItemCustomFont = UIFont(name: "????", size: 14)  //note we're not forcing anything here

//can we use our custom font ????
if let customFont = barItemCustomFont {
    //hooray we can use our font ????
    textAttributes = [NSForegroundColorAttributeName: fontColor, NSFontAttributeName: customFont]
} else {
    //???? not found -> omit setting font name and proceed with system font
    textAttributes = [NSForegroundColorAttributeName: fontColor]
}

//finally
UIBarButtonItem.appearance().setTitleTextAttributes(textAttributes, for: .normal)

Exemple du monde réel

Dans une application réelle, vous devez généralement personnaliser le style de police UINavigationBar et UIBarButton (à part les autres paramètres) pour les rendre visuellement cohérents. Voici la fonction stylizeNavigationFontOfMyAmazingApp???? Pratique que vous pouvez utiliser:

func stylizeNavigationFontOfMyAmazingApp????() {
    //custom font
    let customFont = UIFont(name: "someFancyFont", size: 16)!  //note we're force unwrapping here

    //navigation bar coloring:
    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().barTintColor = UIColor.blue

    //unique text style:
    var fontAttributes: [String: Any]
    fontAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: customFont]

    //navigation bar & navigation buttons font style:
    UINavigationBar.appearance().titleTextAttributes = fontAttributes
    UIBarButtonItem.appearance().setTitleTextAttributes(fontAttributes, for: .normal)

}


Avantages de l'utilisation du proxy appearance()

  • Deux extraits de code de ligne pour styliser tous les UIBarButtonItem dans votre application/projet.
  • Vous pouvez mélanger appearance() proxies de plusieurs classes pour obtenir un style visuel vraiment unique
  • Si vous avez besoin d'un contrôle de personnalisation supplémentaire, vous pouvez personnaliser davantage chaque bouton (par exemple en plaçant des vues personnalisées, des boutons, des images, etc.) - sur une instance spécifique de UIBarButtonItem.

Référence

Apple Docs sur le protocole appearance.

64
Vexy

Si vous souhaitez appliquer cette modification à l'ensemble de votre application, vous pouvez utiliser le code ci-dessous:

Swift 4

J'ai ajouté ces lignes à AppDelegate.Swift dans application fonction:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       UINavigationBar.appearance().titleTextAttributes = [
            NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 20)!
        ]

        UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)

  return true
}

Swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    UINavigationBar.appearance().titleTextAttributes = [
        NSFontAttributeName: UIFont(name: "IranSansMobile", size: 20)!
    ]

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)


    return true
}
20
Milad Faridnia

Swift 3

    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!,NSForegroundColorAttributeName: UIColor.white]
    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!], for: UIControlState.normal)
3
Ahmed Safadi

Lorsque vous êtes sûr d'avoir déjà défini un UIBarButtonItem, vous pouvez faire:

self.navigationItem.leftBarButtonItem!.title = "myTitle"

Pour changer par exemple la couleur, vous pouvez faire ce qui suit:

self.navigationItem.leftBarButtonItem!.tintColor = UIColor.redColor()

Lorsque vous ne l'avez pas défini dans votre storyboard, vous pouvez faire:

self.navigationItem.leftBarButtonItem = UIBarButtonItem()

Pour changer la police, procédez comme suit:

self.navigationItem.leftBarButtonItem!.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: .Normal)

Je devrais peut-être mentionner que vous ne devez pas utiliser self .navigationController car lors de la configuration des boutons de navigationController, ils ne s'affichent pas à l'écran, de sorte que les boutons qui sont à l'écran et ont été définis dans le storyboard doit être self.navigationItem...

3
borchero