167 votes

Définir une police par défaut pour l’application entière iOS ?

J’ai une police personnalisée, je veux utiliser pour tout affichage de texte dans mon application, étiquettes, texte vues etc.

Y a-t-il un moyen de définir la police par défaut (étiquettes par utilisation de défaut SystemFont) pour l’application entière ?

159voto

Randall Points 6284

Cela semble être possible dans iOS 5 en utilisant le proxy UIAppearance.

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

Cela définira la police de manière à correspondre à votre police personnalisée pour toutes les étiquettes UIL de votre application. Vous devrez le répéter pour chaque contrôle (UIButton, UILabel, etc.).

N'oubliez pas que vous devez mettre la valeur UIAppFonts dans votre info.plist et inclure le nom de la police que vous incluez.

74voto

Hugues BR Points 573

Il existe également une autre solution qui consistera à remplacer systemFont.

Il suffit de créer une catégorie

UIFont + SytemFontOverride.h #import

 @interface UIFont (SytemFontOverride)
@end
 

UIFont + SytemFontOverride.m

 @implementation UIFont (SytemFontOverride)

#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 utilisateurs d’UIControl utilisent systemFont.

23voto

Fábio Oliveira Points 1599

Le développement de Hugues BR réponse, mais l'aide de la méthode swizzling j'en suis arrivé à une solution qui est réussi à changer toutes les polices de caractères d'une police souhaitée dans mon application.

Une approche de Type Dynamique devrait être ce que vous devriez regarder pour sur iOS 7. La solution suivante est de ne pas utiliser de Type Dynamique.


Notes:

  • le code ci-dessous, présenté dans son état, n'a jamais été soumise à l'approbation d'Apple;
  • il existe une version plus courte de ce qui passait à Apple de soumission, qui est sans l' - initWithCoder: remplacer. Toutefois à ne pas couvrir 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 par mon AppDelegate classe donc être disponible partout et à tous les UIFont instances;
  • Je suis en utilisant Zapfino ici juste pour faire les modifications beaucoup plus visible;
  • toute amélioration que vous pouvez trouver à ce code est la bienvenue.

Cette solution utilise deux méthodes différentes pour obtenir le résultat final. La première est de remplacer le UIFont les méthodes de la classe + systemFontWithSize: et même avec ceux qui utilisent mes alternatives (j'utilise ici "Zapfino" pour ne laisser aucun doute que le remplacement a été couronnée de succès).

L'autre méthode consiste à substituer - initWithCoder: méthode sur UIFont pour remplacer toutes les occurrences de CTFontRegularUsage et similaires par ma alternatives. Cette dernière méthode a été nécessaire, car j'ai trouvé qu' UILabel objets encodés en PLUME fichiers ne cochez pas la + systemFontWithSize: méthodes pour obtenir leur système de police et, au lieu de les encoder en tant que UICTFontDescriptorobjets. J'ai essayé de remplacer - awakeAfterUsingCoder: mais de toute façon il a été appelé pour chaque codé objet dans mon storyboard et provoquant des plantages. Primordial - awakeFromNib ne serait pas me permettre de lire l' NSCoder objet.

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

3voto

Gingi Points 607

Aucune de ces solutions ne fonctionne de manière universelle dans toute l'application. Une chose que j’ai trouvée pour aider à gérer les polices dans Xcode est d’ouvrir le Storyboard en tant que code source (Ctrl-clic sur le storyboard dans le navigateur de fichiers> "Ouvrir en tant que>> Source"), puis de rechercher et de remplacer.

2voto

Daniel Points 16707

Probablement pas, vous aurez probablement l'ensemble de la police sur votre contrôle de vous-même, mais vous pouvez rendre le processus plus facile par la centralisation de l'endroit où vous obtenez les types de caractères, par exemple l'application d'un délégué ou d'autres classe ont une méthode qui retourne la police, et n'importe quoi avoir à définir la police peut appeler cette méthode, qui aidera au cas où vous avez besoin de changer votre police, youd modifier dans un seul endroit plutôt que partout où vous définissez les polices...une Autre solution peut être de créer des sous-classes de vos Éléments d'INTERFACE utilisateur qui sera automatiquement réglée à la police, mais qui peut-être exagéré..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X