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
.
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
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)
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)
}
appearance()
UIBarButtonItem
dans votre application/projet.appearance()
proxies de plusieurs classes pour obtenir un style visuel vraiment uniqueUIBarButtonItem
.Apple Docs sur le protocole appearance
.
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
}
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)
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
...