web-dev-qa-db-fra.com

Utilisation de polices personnalisées dans Builder d'interface

J'ai cherché ce site mais je viens de trouver des questions sans réponse.

J'ai chargé une police personnalisée dans mon projet Xcode. UNE [UIFont fontWithName:@"Laconic-Light" size:19] travaux. Mais Builder Interface n'aime pas la police. Je ne peux pas l'utiliser avec IB, il montre toujours la police par défaut. Y a-t-il un moyen de dire à IB que son ok d'utiliser la police?

31
david

J'ai également ce problème dans Xcode 4. Dans mon programme, il y a beaucoup de UILabel qui n'ont pas IBOutlets donc je fais de la sorte;

Premièrement, sous-classe le UILabel à CustomFontLabel

Ensuite, remplacer la méthode "awakeFromNib"

@implementation CustomFontLabel

- (void)awakeFromNib {
    [super awakeFromNib];
    self.font = [UIFont fontWithName:@"CustomFontName" size:self.font.pointSize];
}

@end

Enfin, dans l'interface Builder> L'inspecteur d'identité change de classe à CustomFontLabel.

63
Atif

Une autre solution serait de sous-classer Uilabel à charger dans votre police personnalisée. Vous pouvez ensuite le faire référence à IB, même si vous ne pouvez toujours pas voir la police appropriée.

5
James Hall

Je préfère le faire de manière légèrement plus générique, ce qui vous permet de former votre texte dans l'interface Builder et de remplacer simplement les polices au moment de l'exécution.

Je crée une propriété IbCollection pour tous les éléments Uikit pour définir une police pour, puis wider les éléments appropriés de IB.

@property (strong, nonatomic) IBOutletCollection(id) NSArray *lightFontItems;
@property (strong, nonatomic) IBOutletCollection(id) NSArray *regularFontItems;

Puis à mon avis chargé d'utiliser une méthode comme celle-ci:

[self setFontName:@"Roboto-Light" onItemsInArray:[self lightFontItems]];
[self setFontName:@"Roboto-Regular" onItemsInArray:[self regularFontItems]];

Et le setLightFontOnItemsInArray: méthode ressemble à ceci:

+ (void)setFontName:(NSString *)fontName onItemsInArray:(NSArray *)array;
{
  [array each:^(id item) {
    if (![item respondsToSelector:@selector(setFont:)]) return;
    [item performSelector:@selector(setFont:) withObject:[UIFont fontWithName:fontName size:[[item font] pointSize]]];
  }];
}
3
petehare

Vous pouvez installer ce script http://pitaya.ch/moarfonts/ .

Fonctionne vraiment bien pour moi avec Xcode 5.1.1.

3
Adam Bishti

Grâce à Apple, dans Xcode 6, nous avons des polices personnalisées disponibles dans l'interface Builder lui-même.

  1. Ajouter le fichier de polices .ttf sur votre paquet
  2. Ajoutez le nom de la police au fichier .plist.
  3. Allez au fichier XIB/Storyboard, vous pouvez voir votre police.

enter image description here

3
Ramaraj T

Swizzle une police

La solution est généralement simple si vous swizzle la classe Uifont. Je pense qu'il est préférable de choisir une police saintte comme Helvetica Neue et remplacer cela. Cela vous permet de remettre le projet entier dans la norme en tirant sur la cartographie. J'avais déjà monté une swizzle pour atteindre cet objectif lorsque je me suis rendu compte quelqu'un d'autre l'a fait aussi, alors je l'ai aussi pub. AS - Nshipster vous dira que vous pouvez Swizzling peut être dangereux, mais dans ce cas, le risque est assez faible compte tenu de la simplicité absolue de l'API UIFONT. Dans mon cas, cela a été fait pour une application d'entreprise, il s'agissait donc d'un risque même plus faible.

Uifont + CustomFont.m Catégorie

#import <objc/runtime.h>

static NSString *const kFontMapPlist = @"FontMap";
static NSDictionary *_replacementFontDictionary = nil;



@implementation UIFont (CustomFont)


static void initializeReplacementFonts()
{
    static BOOL initialized = NO;
    if (initialized)
        return;
    initialized = YES;

    // A Plist with a Dictionary from->to font name mapping
    NSURL *replacementFontMapURL = [[NSBundle mainBundle] URLForResource:kFontMapPlist withExtension:@"plist"];
    NSDictionary *replacementFontMap = [NSDictionary dictionaryWithContentsOfURL:replacementFontMapURL];
    [UIFont setReplacementFontDictionary:replacementFontMap];
}

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        initializeReplacementFonts();

        SEL fontWithNameSizeSelector = @selector(fontWithName:size:);
        SEL swizzledFontWithNameSizeSelector = @selector(clp_fontWithName:size:);
        SwizzleClassMethod([UIFont class], fontWithNameSizeSelector, swizzledFontWithNameSizeSelector);

        SEL fontWithDescriptorSizeSelector = @selector(fontWithDescriptor:size:);
        SEL swizzledfontWithDescriptorSelector = @selector(clp_fontWithDescriptor:size:);
        SwizzleClassMethod([UIFont class], fontWithDescriptorSizeSelector, swizzledfontWithDescriptorSelector);
    });
}

void SwizzleClassMethod(Class class, SEL originalSelector, SEL replacementSelector)
{
    Class clazz = objc_getMetaClass(class_getName(class));

    Method originalMethod = class_getClassMethod(clazz, originalSelector);
    Method replacementMethod = class_getClassMethod(clazz, replacementSelector);

    // Add method if it doesn't eixst
    BOOL didAddMethod =
    class_addMethod(clazz,
                    originalSelector,
                    method_getImplementation(replacementMethod),
                    method_getTypeEncoding(replacementMethod));


    if (didAddMethod) {
        class_replaceMethod(clazz,
                            replacementSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, replacementMethod);
    }
}



#pragma mark - Swizzled font by descriptor and name calls

+ (UIFont *)clp_fontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)pointSize
{
    NSString *originalFontName = descriptor.fontAttributes[UIFontDescriptorNameAttribute];
    NSString *replacementFontName = _replacementFontDictionary[originalFontName];

    UIFontDescriptor *replacementFontDescriptor = descriptor;
    if (replacementFontName != nil) {
        replacementFontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:@{UIFontDescriptorNameAttribute: replacementFontName}];
    }

    return [self clp_fontWithDescriptor:replacementFontDescriptor size:pointSize];
}

+ (UIFont *)clp_fontWithName:(NSString *)fontName size:(CGFloat)fontSize
{
    NSString *replacementFontName = _replacementFontDictionary[fontName];
    if (replacementFontName == nil) {
        replacementFontName = fontName;
    }

    return [self clp_fontWithName:replacementFontName size:fontSize];
}



#pragma mark - Replacement Dictionary Getter and Setter

+ (NSDictionary *)replacementDictionary
{
    return _replacementFontDictionary;
}

+ (void)setReplacementFontDictionary:(NSDictionary *)replacmentFontDictionary
{
    if (replacmentFontDictionary == _replacementFontDictionary) {
        return;
    }

    _replacementFontDictionary = replacmentFontDictionary;

    // Validate font existence.
    for (NSString *originalFontName in [_replacementFontDictionary allKeys]) {
        NSString *replacementFontName = [_replacementFontDictionary objectForKey:originalFontName];
        UIFont *replacementFont = [UIFont fontWithName:replacementFontName size:10.0f];
        if (replacementFont == nil) {
            DDLogError(@"WARNING: replacement font '%@' is not available.", replacementFontName);
        }
    }
}

@end

Le fontmap.plist

Par souci de simplicité, nous prétendons que nous avons une police appelée les douaniers.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>HelveticaNeue-Light</key>
    <string>CustomSans-Light</string>
    <key>HelveticaNeue-LightItalic</key>
    <string>CustomSans-LightItalic</string>
    <key>HelveticaNeue-Bold</key>
    <string>CustomSans-Bold</string>
    <key>HelveticaNeue-BoldItalic</key>
    <string>CustomSans-BoldItalic</string>
</dict>
</plist>
1