Définir une police par défaut pour l'ensemble de l'application iOS?

j'ai une police personnalisée que je veux utiliser pour tout ce qui affiche du texte dans mon application, des étiquettes, des vues de texte, etc.

Est-il un moyen de définir la police par défaut (étiquettes par défaut, utilisez SystemFont) pour l'ensemble de l'application?

127
demandé sur Bhavin Ramani 2012-01-03 05:44:57

16 réponses

cela semble possible dans iOS 5 en utilisant le proxy UIAppearance.

 [[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:17.0]];

qui définira la police à utiliser quelle que soit votre police personnalisée pour tous les UILabels de votre application. Vous devrez le répéter pour chaque contrôle (UIButton, UILabel, etc.).

rappelez-vous que vous aurez besoin de mettre la valeur UIAppFonts dans vos informations.insérez et incluez le nom de la police que vous incluez.

155
répondu Randall 2016-12-22 17:55:57

il y a aussi une autre solution qui sera d'outrepasser systemFont.

créez juste une catégorie

UIFont+SystemFontOverride.h

#import <UIKit/UIKit.h>

@interface UIFont (SystemFontOverride)
@end

UIFont+SystemFontOverride.m

@implementation UIFont (SystemFontOverride)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"fontName" size:fontSize];
}

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"fontName" size:fontSize];
}

#pragma clang diagnostic pop

@end

cela remplacera l'implémentation par défaut et la plupart des UIControls utilisent systemFont.

74
répondu Hugues BR 2016-12-22 12:41:52

Swift 4.1

Base sur la réponse de Fábio Oliveira ( https://stackoverflow.com/a/23042694/2082851 ), je fais mon propre swift 4.

en bref, cette extension échange des fonctions par défaut init(coder:) , systemFont(ofSize:) , boldSystemFont(ofSize:) , italicSystemFont(ofSize:) avec mes méthodes personnalisées.

notez que ce n'est pas entièrement implémenté, mais vous pouvez échanger plus de méthodes basées sur mon implémentation.

import UIKit

struct AppFontName {
    static let regular = "CourierNewPSMT"
    static let bold = "CourierNewPS-BoldMT"
    static let italic = "CourierNewPS-ItalicMT"
}

extension UIFontDescriptor.AttributeName {
    static let nsctFontUIUsage = UIFontDescriptor.AttributeName(rawValue: "NSCTFontUIUsageAttribute")
}

extension UIFont {

    @objc class func mySystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: AppFontName.regular, size: size)!
    }

    @objc class func myBoldSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: AppFontName.bold, size: size)!
    }

    @objc class func myItalicSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: AppFontName.italic, size: size)!
    }

    @objc convenience init(myCoder aDecoder: NSCoder) {
        guard
            let fontDescriptor = aDecoder.decodeObject(forKey: "UIFontDescriptor") as? UIFontDescriptor,
            let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String else {
                self.init(myCoder: aDecoder)
                return
        }
        var fontName = ""
        switch fontAttribute {
        case "CTFontRegularUsage":
            fontName = AppFontName.regular
        case "CTFontEmphasizedUsage", "CTFontBoldUsage":
            fontName = AppFontName.bold
        case "CTFontObliqueUsage":
            fontName = AppFontName.italic
        default:
            fontName = AppFontName.regular
        }
        self.init(name: fontName, size: fontDescriptor.pointSize)!
    }

    class func overrideInitialize() {
        guard self == UIFont.self else { return }

        if let systemFontMethod = class_getClassMethod(self, #selector(systemFont(ofSize:))),
            let mySystemFontMethod = class_getClassMethod(self, #selector(mySystemFont(ofSize:))) {
            method_exchangeImplementations(systemFontMethod, mySystemFontMethod)
        }

        if let boldSystemFontMethod = class_getClassMethod(self, #selector(boldSystemFont(ofSize:))),
            let myBoldSystemFontMethod = class_getClassMethod(self, #selector(myBoldSystemFont(ofSize:))) {
            method_exchangeImplementations(boldSystemFontMethod, myBoldSystemFontMethod)
        }

        if let italicSystemFontMethod = class_getClassMethod(self, #selector(italicSystemFont(ofSize:))),
            let myItalicSystemFontMethod = class_getClassMethod(self, #selector(myItalicSystemFont(ofSize:))) {
            method_exchangeImplementations(italicSystemFontMethod, myItalicSystemFontMethod)
        }

        if let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:))), // Trick to get over the lack of UIFont.init(coder:))
            let myInitCoderMethod = class_getInstanceMethod(self, #selector(UIFont.init(myCoder:))) {
            method_exchangeImplementations(initCoderMethod, myInitCoderMethod)
        }
    }
}


class AppDelegate: UIResponder, UIApplicationDelegate {
    // Avoid warning of Swift
    // Method 'initialize()' defines Objective-C class method 'initialize', which is not guaranteed to be invoked by Swift and will be disallowed in future versions
    override init() {
        super.init()
        UIFont.overrideInitialize()
    }
    ...
}
60
répondu nahung89 2018-04-06 18:12:22

si vous utilisez Swift, vous pouvez créer une extension UILabel:

extension UILabel {

    var substituteFontName : String {
        get { return self.font.fontName }
        set { self.font = UIFont(name: newValue, size: self.font.pointSize) }
    }

}

et ensuite où vous faites votre apparence proxy:

UILabel.appearance().substituteFontName = applicationFont

il y a un code objectif-c équivalent utilisant UI_APPEARANCE_SELECTOR sur une propriété avec le nom substituteFontName .

Plus

pour le cas où vous voudriez mettre des polices de caractères gras et régulières séparément:

extension UILabel {

    var substituteFontName : String {
        get { return self.font.fontName }
        set { 
            if self.font.fontName.range(of:"Medium") == nil { 
                self.font = UIFont(name: newValue, size: self.font.pointSize)
            }
        }
    }

    var substituteFontNameBold : String {
        get { return self.font.fontName }
        set { 
            if self.font.fontName.range(of:"Medium") != nil { 
                self.font = UIFont(name: newValue, size: self.font.pointSize)
            }
        }
    }
}

puis pour vos mandataires UIAppearance:

UILabel.appearance().substituteFontName = applicationFont
UILabel.appearance().substituteFontNameBold = applicationFontBold

Note: Si vous constatez que la substitution en gras ne fonctionne pas, il est possible que le nom de police par défaut ne contienne pas "Medium". Interrupteur de la chaîne pour un autre match en tant que de besoin (grâce à Mason dans les commentaires ci-dessous) .

57
répondu Sandy Chapman 2017-12-04 15:42:21

développement à partir de Hugues BR réponse, mais en utilisant la méthode swizzling je suis arrivé à une solution qui est avec succès de changer toutes les polices à une police désirée dans mon application.

une approche de type dynamique devrait être ce que vous devriez chercher sur iOS 7. La solution suivante n'utilise pas le type dynamique.


Notes:

  • le code ci-dessous, dans sa présentation
  • il y a une version plus courte qui a passé Apple submission, c'est-à-dire sans le - initWithCoder: override. Cependant, cela ne couvrira pas tous les cas;
  • le code suivant est présent dans une classe que j'utilise pour définir le style de mon application qui est inclus dans ma classe AppDelegate étant ainsi disponible partout et à toutes les instances UIFont;
  • J'utilise Zapfino ici juste pour faire le changements beaucoup plus visibles;
  • toute amélioration que vous trouverez à ce code est la bienvenue.

cette solution utilise deux méthodes différentes pour obtenir le résultat final. La première est d'outrepasser les méthodes de classe UIFont + systemFontWithSize: et similaire avec ceux qui utilisent mes alternatives (ici, j'utilise" Zapfino " pour ne laisser aucun doute que le remplacement a réussi).

L'autre méthode consiste à substituer - initWithCoder: méthode sur UIFont pour remplacer toute occurrence de CTFontRegularUsage et similaire par mes alternatives. Cette dernière méthode était nécessaire car j'ai trouvé que les objets UILabel encodés dans les fichiers NIB ne vérifient pas les méthodes + systemFontWithSize: pour obtenir leur police système et les encodent plutôt comme des objets UICTFontDescriptor . J'ai essayé de remplacer - awakeAfterUsingCoder: mais d'une façon ou d'une autre il a été appelé pour chaque objet encodé dans mon storyboard et causer des accidents. - awakeFromNib ne me permettrait pas de lisez l'objet NSCoder .

#import <objc/runtime.h>

NSString *const FORegularFontName = @"Zapfino";
NSString *const FOBoldFontName = @"Zapfino";
NSString *const FOItalicFontName = @"Zapfino";

#pragma mark - UIFont category
@implementation UIFont (CustomFonts)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+ (void)replaceClassSelector:(SEL)originalSelector withSelector:(SEL)modifiedSelector {
    Method originalMethod = class_getClassMethod(self, originalSelector);
    Method modifiedMethod = class_getClassMethod(self, modifiedSelector);
    method_exchangeImplementations(originalMethod, modifiedMethod);
}

+ (void)replaceInstanceSelector:(SEL)originalSelector withSelector:(SEL)modifiedSelector {
    Method originalDecoderMethod = class_getInstanceMethod(self, originalSelector);
    Method modifiedDecoderMethod = class_getInstanceMethod(self, modifiedSelector);
    method_exchangeImplementations(originalDecoderMethod, modifiedDecoderMethod);
}

+ (UIFont *)regularFontWithSize:(CGFloat)size
{
    return [UIFont fontWithName:FORegularFontName size:size];
}

+ (UIFont *)boldFontWithSize:(CGFloat)size
{
    return [UIFont fontWithName:FOBoldFontName size:size];
}

+ (UIFont *)italicFontOfSize:(CGFloat)fontSize
{
    return [UIFont fontWithName:FOItalicFontName size:fontSize];
}

- (id)initCustomWithCoder:(NSCoder *)aDecoder {
    BOOL result = [aDecoder containsValueForKey:@"UIFontDescriptor"];

    if (result) {
        UIFontDescriptor *descriptor = [aDecoder decodeObjectForKey:@"UIFontDescriptor"];

        NSString *fontName;
        if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontRegularUsage"]) {
            fontName = FORegularFontName;
        }
        else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontEmphasizedUsage"]) {
            fontName = FOBoldFontName;
        }
        else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontObliqueUsage"]) {
            fontName = FOItalicFontName;
        }
        else {
            fontName = descriptor.fontAttributes[@"NSFontNameAttribute"];
        }

        return [UIFont fontWithName:fontName size:descriptor.pointSize];
    }

    self = [self initCustomWithCoder:aDecoder];

    return self;
}

+ (void)load
{
    [self replaceClassSelector:@selector(systemFontOfSize:) withSelector:@selector(regularFontWithSize:)];
    [self replaceClassSelector:@selector(boldSystemFontOfSize:) withSelector:@selector(boldFontWithSize:)];
    [self replaceClassSelector:@selector(italicSystemFontOfSize:) withSelector:@selector(italicFontOfSize:)];

    [self replaceInstanceSelector:@selector(initWithCoder:) withSelector:@selector(initCustomWithCoder:)];
}
#pragma clang diagnostic pop

@end
22
répondu Fábio Oliveira 2017-09-20 02:15:31

pour compléter réponse de Sandy Chapman , voici une solution dans L'objectif-C (mettre cette catégorie n'importe où vous voulez changer UILabel Appearance ):

@implementation UILabel (SubstituteFontName)
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR {
    self.font = [UIFont fontWithName:name size:self.font.pointSize];
}
@end

le fichier d'interface, devrait avoir cette méthode publiquement déclaré à être utilisé plus tard à partir d'endroits comme votre délégué app:

@interface UILabel (FontOverride)
  - (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR;
@end

alors, vous pouvez changer le Appearance avec:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"];
12
répondu Damien Debin 2018-09-22 07:02:18

j'ai publié une nouvelle réponse et non pas comme un commentaire parce que je n'ai pas assez de réputation.

COMMENT FOR SWIFT 3.0 AND SWIFT WARNING

vous pouvez supprimer le message d'avertissement dans la ligne:

let initCoderMethod = class_getInstanceMethod(self, Selector("initWithCoder:"))

en le remplaçant par:

let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:)))
4
répondu ucotta 2017-02-15 01:08:14

Pour Swift 4

toutes les réponses ci-dessus sont correctes, mais je l'ai fait d'une manière peu différente qui est selon la taille de l'appareil . Ici, dans la classe ATFontManager, j'ai fait la taille de police par défaut qui est défini en haut de la classe comme defaultFontSize , c'est la taille de police de plus iphone et vous pouvez changer selon votre exigence.

     class ATFontManager: UIFont{

    class func setFont( _ iPhone7PlusFontSize: CGFloat? = nil,andFontName fontN : String = FontName.HelveticaNeue) -> UIFont{

        let defaultFontSize : CGFloat = 16

        switch ATDeviceDetector().screenType {

        case .iPhone4:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize - 3)!
            }
            return UIFont(name: fontN, size: defaultFontSize - 6)!

        case .iPhone5:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize - 2)!
            }
            return UIFont(name: fontN, size: defaultFontSize - 3)!

        case .iPhone6AndIphone7:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize - 1)!
            }
            return UIFont(name: fontN, size: defaultFontSize - 1)!

        case .iPhone6PAndIPhone7P:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? defaultFontSize)!
        case .iPhoneX:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? defaultFontSize)!

        case .iPhoneOrIPadSmallSizeUnknown:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? defaultFontSize)!

        case .iPadMini:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize + 4)!
            }
            return UIFont(name: fontN, size: defaultFontSize + 4)!

        case .iPadPro10Inch:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize + 5)!
            }
            return UIFont(name: fontN, size: defaultFontSize + 5)!

        case .iPadPro:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize + 6)!
            }
            return UIFont(name: fontN, size: defaultFontSize + 6)!

        case .iPadUnknown:

            return UIFont(name: fontN, size: defaultFontSize + 3)!

        default:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? 15)!
        }
    }
}

j'ai ajouté certains noms de police, pour plus vous pouvez ajouter le nom de police et taper ici.

   enum FontName : String {
        case HelveticaNeue = "HelveticaNeue"
        case HelveticaNeueUltraLight = "HelveticaNeue-UltraLight"
        case HelveticaNeueBold = "HelveticaNeue-Bold"
        case HelveticaNeueBoldItalic = "HelveticaNeue-BoldItalic"
        case HelveticaNeueMedium = "HelveticaNeue-Medium"
        case AvenirBlack = "Avenir-Black"
        case ArialBoldMT = "Arial-BoldMT"
        case HoeflerTextBlack = "HoeflerText-Black"
        case AMCAPEternal = "AMCAPEternal"
    }

cette classe se rapporte au détecteur de dispositif afin de fournir la taille de police appropriée selon le dispositif.

class ATDeviceDetector {

    var iPhone: Bool {

        return UIDevice().userInterfaceIdiom == .phone
    }

    var ipad : Bool{

        return UIDevice().userInterfaceIdiom == .pad
    }

    let isRetina = UIScreen.main.scale >= 2.0


    enum ScreenType: String {

        case iPhone4
        case iPhone5
        case iPhone6AndIphone7
        case iPhone6PAndIPhone7P
        case iPhoneX

        case iPadMini
        case iPadPro
        case iPadPro10Inch

        case iPhoneOrIPadSmallSizeUnknown
        case iPadUnknown
        case unknown
    }


    struct ScreenSize{

        static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
        static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
        static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH,ScreenSize.SCREEN_HEIGHT)
        static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH,ScreenSize.SCREEN_HEIGHT)
    }


    var screenType: ScreenType {

        switch ScreenSize.SCREEN_MAX_LENGTH {

        case 0..<568.0:
            return .iPhone4
        case 568.0:
            return .iPhone5
        case 667.0:
            return .iPhone6AndIphone7
        case 736.0:
            return .iPhone6PAndIPhone7P
        case 812.0:
            return .iPhoneX
        case 568.0..<812.0:
            return .iPhoneOrIPadSmallSizeUnknown
        case 1112.0:
            return .iPadPro10Inch
        case 1024.0:
            return .iPadMini
        case 1366.0:
            return .iPadPro
        case 812.0..<1366.0:
            return .iPadUnknown
        default:
            return .unknown
        }
    }
}

comment utiliser. j'Espère que ça aidera.

//for default 
label.font = ATFontManager.setFont()

//if you want to provide as your demand. Here **iPhone7PlusFontSize** variable is denoted as font size for *iphone 7plus and iphone 6 plus*, and it **ATFontManager** class automatically handle.
label.font = ATFontManager.setFont(iPhone7PlusFontSize: 15, andFontName: FontName.HelveticaNeue.rawValue)
3
répondu Amrit Tiwari 2018-04-27 08:45:11

probablement pas, vous aurez probablement l'ensemble de la police sur votre contrôle vous-même, mais vous pouvez rendre le processus plus facile en centralisant où vous obtenez les types de fonte, par exemple avoir l'app delegate ou une autre classe commune ont une méthode qui renvoie la fonte, et tout ce qui a besoin de définir la fonte peut appeler cette méthode, qui aidera dans le cas où vous avez besoin de changer votre fonte, vous le changez à un endroit plutôt que partout où vous définissez les fontes...Une autre solution peut être de faire sous-classes de vos éléments UI qui définiront automatiquement la police, mais qui pourrait être exagérée..

2
répondu Daniel 2012-01-03 03:18:29

aucune de ces solutions ne fonctionne universellement dans l'application. Une chose que j'ai trouvée pour aider à gérer les polices de caractères dans Xcode est d'ouvrir le Storyboard comme code Source (Control-click storyboard in Files navigator > "Open as" > "Source"), puis de faire une recherche-et-remplacer.

2
répondu Gingi 2014-06-25 19:15:06

le type de police doit toujours être défini dans le code et le nib / storyboard.

Pour le code,tout comme Hugues BR a dit ,est-il dans la catégorie de résoudre le problème.

pour le nib / storyboard, nous pouvons utiliser la méthode Swizzling awakeFromNib pour changer le type de police puisque L'élément UI de nib/storyboard l'appelle toujours avant de l'afficher à l'écran.

je suppose que vous savez Aspects .C'est une bibliothèque pour AOP. programmation, basée sur la méthode Swizzling. Nous créons catagory pour UILabel,UIButton, UITextView pour l'implémenter.

UILabel:

#import "UILabel+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UILabel (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UILabel* instance = [aspectInfo instance];
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:instance.font.pointSize];
        instance.font = font;
    }error:nil];
}

@end

UIButton:

#import "UIButton+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UIButton (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UIButton* instance = [aspectInfo instance];
        UILabel* label = instance.titleLabel;
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:label.font.pointSize];
        instance.titleLabel.font = font;
    }error:nil];
}

@end

UITextField:

#import "UITextField+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UITextField (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UITextField* instance = [aspectInfo instance];
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:instance.font.pointSize];
        instance.font = font;
    }error:nil];
}

@end

UITextView:

#import "UITextView+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UITextView (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UITextView* instance = [aspectInfo instance];
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:instance.font.pointSize];
        instance.font = font;
    }error:nil];
}

@end

c'est tout,vous pouvez changer HelveticaNeue-light en macro avec votre nom de police.

2
répondu Peng Xiaofeng 2017-05-23 12:18:33

NUI est une alternative à la UIAppearance proxy. Il vous donne le contrôle sur la police (et de nombreux autres attributs) d'un grand nombre de types D'éléments de L'interface utilisateur tout au long de votre application en modifiant simplement une feuille de style, qui peut être réutilisé à travers de multiples applications.

après avoir ajouté une classe NUILabel à vos étiquettes, vous pouvez facilement contrôler leur police dans la feuille de style:

LabelFontName    String    Helvetica

Si vous avez des étiquettes avec différentes tailles de police, vous pouvez contrôler leurs tailles en utilisant les classes de Nui Label, LargeLabel et SmallLabel, ou même créer rapidement vos propres classes.

1
répondu Tom 2012-11-27 19:11:34

nous avons obtenu la même chose dans Swift-Xcode 7.2 en utilisant le contrôleur de vue Parent et le contrôleur de vue enfant (héritage).

Fichier - Nouveau - Cocoa Touch classe - ParentViewController.

    import UIKit
    import Foundation

    class ParentViewController: UIViewController {

        var appUIColor:UIColor = UIColor.redColor()
        var appFont:UIFont = UIFont(name: "Copperplate", size: 20)!

        override func viewDidLoad() {
            super.viewDidLoad()
        }
        func addStatusBar()
        {
            let view = UIView(frame:
                CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0)
            )
            view.backgroundColor = appUIColor
            self.view.addSubview(view)
        }
    }    

faire des contrôleurs de vue d'enfant et s'associer avec un StoryBoard VC, ajouter un textLabel.

    import UIKit

    class FontTestController: ParentViewController {
        @IBOutlet var testLabel: UILabel!

        override func viewDidLoad() {
            super.viewDidLoad()
            testLabel.font =  appFont
            testLabel.textColor = appUIColor
        }

ou créer une classe UILabel personnalisée(méthode de sous-classification) et y associer les étiquettes requises.

import Foundation
import UIKit

class CustomFontLabel: UILabel {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        backgroundColor = ParentViewController().appUIColor
        font = ParentViewController().appFont
        textColor = UIColor.blackColor()
    }
}

Note: la police et la couleur déclarées dans le Parent VC sont implémentées dans CustomFontLabel . L'avantage est que nous pouvons modifier les propriétés de uilabel/n'importe quelle vue tous ensemble dans quelques changements simples de parent VC.

2) "pour" boucle UIView pour les sous-vues. Il ne fonctionne que sur un VC particulier.

    override func viewWillLayoutSubviews() {
            for view in self.view.subviews  {
                if view.isKindOfClass(UITextField) {
                UITextField.appearance().font =  UIFont(name: "Copperplate", size: 20)
                }
                if view.isKindOfClass(UILabel) {
                    UILabel.appearance().font =  UIFont(name: "Copperplate", size: 20)    
                }               
            }       
        }
0
répondu A.G 2016-02-13 21:15:30

utilise comme ce type de classe de police dans swift. Utilisation de la classe font extension.

enum FontName: String {

  case regular      = "Roboto-Regular"

}

//MARK: - Set Font Size
enum FontSize: CGFloat {
    case size = 10

}
extension UIFont {

    //MARK: - Bold Font
  class var regularFont10: UIFont {
        return UIFont(name: FontName.regular.rawValue, size:FontSize.size.rawValue )!
    }
}
0
répondu Karthickkck 2018-01-30 12:03:17

Pour Xamarin.iOS à l'intérieur de AppDelegate FinishedLaunching() mettre le code comme ceci :-

UILabel.Appearance.Font= UIFont.FromName("Lato-Regular", 14);

définir police pour l'ensemble de l'application et Ajouter" UIAppFonts " clé sur Info.plist , le chemin doit être le chemin où le fichier de police .ttf est situé .Pour moi, c'était dans le dossier "fonts" de mon projet.

<key>UIAppFonts</key>
    <array>
        <string>fonts/Lato-Regular.ttf</string>
    </array>
0
répondu Annu 2018-09-19 12:30:40

j'ai créé ma propre conversion de typographie pour Swift 4 après avoir examiné quelques messages, il couvre la plupart des cas, tels que:

struct Resources {

    struct Fonts {
        //struct is extended in Fonts
    }
}

extension Resources.Fonts {

    enum Weight: String {
        case light = "Typo-Light"
        case regular = "Typo-Regular"
        case semibold = "Typo-Semibold"
        case italic = "Typo-LightItalic"
    }
}

extension UIFontDescriptor.AttributeName {
    static let nsctFontUIUsage = UIFontDescriptor.AttributeName(rawValue: "NSCTFontUIUsageAttribute")
}

extension UIFont {

    @objc class func mySystemFont(ofSize: CGFloat, weight: UIFont.Weight) -> UIFont {
        switch weight {
        case .semibold, .bold, .heavy, .black:
            return UIFont(name: Resources.Fonts.Weight.semibold.rawValue, size: ofSize)!

        case .medium, .regular:
            return UIFont(name: Resources.Fonts.Weight.regular.rawValue, size: ofSize)!

        default:
            return UIFont(name: Resources.Fonts.Weight.light.rawValue, size: ofSize)!
        }
    }

    @objc class func mySystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: Resources.Fonts.Weight.light.rawValue, size: size)!
    }

    @objc class func myBoldSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: Resources.Fonts.Weight.semibold.rawValue, size: size)!
    }

    @objc class func myItalicSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: Resources.Fonts.Weight.italic.rawValue, size: size)!
    }

    @objc convenience init(myCoder aDecoder: NSCoder) {
        guard
            let fontDescriptor = aDecoder.decodeObject(forKey: "UIFontDescriptor") as? UIFontDescriptor,
            let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String else {
                self.init(myCoder: aDecoder)
                return
        }
        var fontName = ""
        switch fontAttribute {
        case "CTFontRegularUsage", "CTFontMediumUsage":
            fontName = Resources.Fonts.Weight.regular.rawValue
        case "CTFontEmphasizedUsage", "CTFontBoldUsage", "CTFontSemiboldUsage","CTFontHeavyUsage", "CTFontBlackUsage":
            fontName = Resources.Fonts.Weight.semibold.rawValue
        case "CTFontObliqueUsage":
            fontName = Resources.Fonts.Weight.italic.rawValue
        default:
            fontName = Resources.Fonts.Weight.light.rawValue
        }
        self.init(name: fontName, size: fontDescriptor.pointSize)!
    }

    class func overrideDefaultTypography() {
        guard self == UIFont.self else { return }

        if let systemFontMethodWithWeight = class_getClassMethod(self, #selector(systemFont(ofSize: weight:))),
            let mySystemFontMethodWithWeight = class_getClassMethod(self, #selector(mySystemFont(ofSize: weight:))) {
            method_exchangeImplementations(systemFontMethodWithWeight, mySystemFontMethodWithWeight)
        }

        if let systemFontMethod = class_getClassMethod(self, #selector(systemFont(ofSize:))),
            let mySystemFontMethod = class_getClassMethod(self, #selector(mySystemFont(ofSize:))) {
            method_exchangeImplementations(systemFontMethod, mySystemFontMethod)
        }

        if let boldSystemFontMethod = class_getClassMethod(self, #selector(boldSystemFont(ofSize:))),
            let myBoldSystemFontMethod = class_getClassMethod(self, #selector(myBoldSystemFont(ofSize:))) {
            method_exchangeImplementations(boldSystemFontMethod, myBoldSystemFontMethod)
        }

        if let italicSystemFontMethod = class_getClassMethod(self, #selector(italicSystemFont(ofSize:))),
            let myItalicSystemFontMethod = class_getClassMethod(self, #selector(myItalicSystemFont(ofSize:))) {
            method_exchangeImplementations(italicSystemFontMethod, myItalicSystemFontMethod)
        }

        if let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:))),
            let myInitCoderMethod = class_getInstanceMethod(self, #selector(UIFont.init(myCoder:))) {
            method_exchangeImplementations(initCoderMethod, myInitCoderMethod)
        }
    }
}

enfin appel à la méthode créée à Appdelegate comme suivant:

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

        UIFont.overrideDefaultTypography()
        return true
    }
}
0
répondu Javier Amor Penas 2018-10-01 13:42:32