web-dev-qa-db-fra.com

Utilisation de polices personnalisées pour l'ensemble de l'application iOS

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

15
tawheed

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)
28
Christian

Pour une réponse plus détaillée et avec ces avantages, je vous recommande d’utiliser des extensions: 

  • Aucun remplacement de taille (tout ce que vous aurez défini dans le concepteur sera utilisé)
  • Aucun remplacement de style (gras, léger, moyen, UltraLight est implémenté dans mon code mais vous pouvez le personnaliser à votre guise)
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

11
Mostafa Aghajani

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"))
3
Rmalmoe

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.

1
Surjeet