Je sais que pour définir la police personnalisée d'un élément à l'écran, je peux simplement faire someLabel.font=UIFont(name: "Exo 2.0", size: 15)
.
Je me demandais comment on pouvait le configurer pour une application entière en utilisant Swift. (Un bidouillage serait de faire ce que je sais pour chaque élément de l'application mais cela ne sera qu'un cauchemar de maintenabilité)
Je vois que cette question a déjà été posée avec une balise objective-C, Comment définir une police personnalisée pour une application iOS entière sans spécifier la taille mais je ne connais pas suffisamment Objective-C pour transférer le code vers Rapide
Vous pouvez définir l'apparence de UILabel et d'autres UIViews:
UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)
Plus général:
AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize)
Pour une réponse plus détaillée et avec ces avantages, je vous recommande d’utiliser des extensions:
import UIKit
extension UILabel {
public var substituteFontName : String {
get {
return self.font.fontName;
}
set {
let fontNameToTest = self.font.fontName.lowercased();
var fontName = newValue;
if fontNameToTest.range(of: "bold") != nil {
fontName += "-Bold";
} else if fontNameToTest.range(of: "medium") != nil {
fontName += "-Medium";
} else if fontNameToTest.range(of: "light") != nil {
fontName += "-Light";
} else if fontNameToTest.range(of: "ultralight") != nil {
fontName += "-UltraLight";
}
self.font = UIFont(name: fontName, size: self.font.pointSize)
}
}
}
extension UITextView {
public var substituteFontName : String {
get {
return self.font?.fontName ?? "";
}
set {
let fontNameToTest = self.font?.fontName.lowercased() ?? "";
var fontName = newValue;
if fontNameToTest.range(of: "bold") != nil {
fontName += "-Bold";
} else if fontNameToTest.range(of: "medium") != nil {
fontName += "-Medium";
} else if fontNameToTest.range(of: "light") != nil {
fontName += "-Light";
} else if fontNameToTest.range(of: "ultralight") != nil {
fontName += "-UltraLight";
}
self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17)
}
}
}
extension UITextField {
public var substituteFontName : String {
get {
return self.font?.fontName ?? "";
}
set {
let fontNameToTest = self.font?.fontName.lowercased() ?? "";
var fontName = newValue;
if fontNameToTest.range(of: "bold") != nil {
fontName += "-Bold";
} else if fontNameToTest.range(of: "medium") != nil {
fontName += "-Medium";
} else if fontNameToTest.range(of: "light") != nil {
fontName += "-Light";
} else if fontNameToTest.range(of: "ultralight") != nil {
fontName += "-UltraLight";
}
self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17)
}
}
}
Exemples d'utilisation d'extensions:
par exemple. mettez ces lignes dans votre contrôleur de démarrage viewDidLoad
UILabel.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
UITextView.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
UITextField.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
P.S. comme @Christian l'a mentionné, vous pouvez écrire vos propres extensions pour presque AnyUIView
FINALEMENT compris cela. Le moyen le plus propre que j'ai pu trouver. (Swift 4) La solution ne vous oblige pas à définir les tailles de police et ne remplace pas toutes les tailles de police.
UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFontTextStyle(rawValue: "Roboto"))
Pour ceux qui cherchent où placer ce code. Je le mets dans mon fichier AppDelegate.Swift à l’intérieur de
func application(_ application: UIApplication,
didFinishLaunchingWithOptions...
Swift 4.2
UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle(rawValue: "Roboto"))
J'ai découvert un moyen de faire de même dans Swift 4 avec iOS 11
Il suffit d’ajouter le mot clé @objc
avant le nom de la variable . Ainsi, la déclaration de la variable sera comme ceci
@objc public var substituteFontName : String {
get {}
set {}
}
J'espère que cela aidera les autres qui font face à ce problème.