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 UICTFontDescriptor
objets.
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