web-dev-qa-db-fra.com

Police personnalisée dans un storyboard?

J'ai une police ajoutée à mon projet iOS. C'est dans le projet et copié lorsque le projet se construit. Cela semble être une police valide et apparaîtra si je liste toutes les polices sur l'appareil via l'application. J'ai le plist configuré correctement pour inclure la police. Je n'arrive pas à trouver la découverte pour l'utiliser dans mes contrôles de texte, mes boutons, etc., dans la section Storyboard de Xcode 4.2. De plus, cela ne semble pas me permettre de taper le nom de la police, cela me force à utiliser le dialogue de police. J'ai également essayé d'installer cette police dans le système, mais je n'arrive pas à la faire apparaître dans cette liste. Dois-je faire cela uniquement dans le code ou puis-je le faire via l'interface de storyboard?

Notez que je peux obtenir que cela fonctionne dans le code, mais il serait beaucoup plus pratique de le faire via le storyboard.

63
slycrel

MISE À JOUR: Xcode 6 Interface Builder vous permet maintenant de sélectionner des polices personnalisées et les restitue correctement au moment de la conception.

Je sais que cette question est assez ancienne, mais je me suis efforcé de trouver un moyen simple de spécifier facilement une police personnalisée dans Storyboard (ou Interface Builder) pour iOS 5 et j'ai trouvé une solution relativement pratique.

Tout d’abord, assurez-vous que vous avez ajouté la police au projet en suivant ce tutoriel . N'oubliez pas non plus que la police personnalisée UINavigationBar, UITabBar et UISegmentedControl peut être spécifiée à l'aide de la méthode setTitleTextAttributes: du UIAppearance proxy .

Ajoutez les catégories ci-dessous au projet pour UIButton, UITextField, UILabel et tout autre composant nécessitant une police personnalisée. Les catégories implémentent simplement une nouvelle propriété fontName qui modifie la police actuelle de l'élément tout en conservant la taille de la police.

Pour spécifier la police dans Storyboard, sélectionnez simplement l'élément souhaité (libellé, bouton, affichage du texte, etc.) et ajoutez un attribut d'exécution défini par l'utilisateur avec chemin d'accès à la clé défini sur nom de police de type String et une valeur avec le nom de votre police personnalisée.

Custom font Storyboard

Et c'est tout, vous n'avez même pas besoin d'importer les catégories. De cette façon, vous n'avez pas besoin d'une prise pour chaque composant d'interface utilisateur nécessitant une police personnalisée et vous n'avez pas besoin de le coder manuellement.

Tenez compte du fait que la police n'apparaîtra pas dans Storyboard, mais vous la verrez lors de l'exécution sur votre appareil ou votre simulateur.


Fichiers de catégorie

UIButton + TCCustomFont.h:

#import <UIKit/UIKit.h>

@interface UIButton (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UIButton + TCCustomFont.m:

#import "UIButton+TCCustomFont.h"

@implementation UIButton (TCCustomFont)

- (NSString *)fontName {
    return self.titleLabel.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.titleLabel.font = [UIFont fontWithName:fontName size:self.titleLabel.font.pointSize];
}

@end

UILabel + TCCustomFont.h:

#import <UIKit/UIKit.h>

@interface UILabel (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UILabel + TCCustomFont.m:

#import "UILabel+TCCustomFont.h"

@implementation UILabel (TCCustomFont)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end

UITextField + TCCustomFont.h:

#import <UIKit/UIKit.h>

@interface UITextField (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UITextField + TCCustomFont.m:

#import "UITextField+TCCustomFont.h"

@implementation UITextField (TCCustomFont)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end

Également téléchargeable à partir de Gist et aussi en tant que un fichier unique .

Dépannage

Si vous exécutez des erreurs d'exécution parce que la propriété fontName n'est pas spécifiée, ajoutez simplement l'indicateur -all_load sous Autre éditeur de liens Indicateur dans les paramètres du projet pour forcer l'éditeur de liens à inclure les catégories.

145
redent84

A partir de Xcode6.0, en tant que Version Xcode6.0 note: 

Interface Builder restitue les polices iOS personnalisées intégrées au moment de la conception, donnant ainsi un aperçu plus précis de l'apparence de l'application finale, avec les dimensions correctes.

vous pouvez définir la police de l'étiquette dans le storyboard.Vous pouvez procéder comme suit

  1. Obtenez votre fichier de police personnalisé (.ttf,. Ttc)
  2. Importez les fichiers de police dans votre projet Xcode.

    enter image description here

  3. Dans app-info.plist, ajoutez une clé nommée Fonts fournie par l'application. Il s'agit d'un type de tableau, ajoutez tous vos noms de fichier de police au tableau, note: y compris l'extension de fichier.

enter image description here

  1. Dans le storyboard, faites glisser un UILabel sur votre interface, sélectionnez-le et accédez à l'inspecteur Attribute, cliquez sur le bouton icône de droite de la zone de sélection Police. Dans le panneau contextuel, choisissez Police. à Custom, puis choisissez la Famille de votre nom de police intégrée.

enter image description here

ref à

58
monjer

C'est un bogue dans XCode, présent depuis la version 3.x et toujours non corrigé. Moi aussi j'ai fait face au même problème, j'ai même essayé de l'ajouter à mon système sans succès. Voici un autre article SO à ce sujet Les polices ne s'affichent pas dans Interface Builder

5
Dan

La réponse de Monjer est la bonne. Si, comme moi, vous ne voyez pas la police ajoutée après la compilation, assurez-vous de l'ajouter aux phases de construction (cibles -> phases de construction -> copier les ressources de l'ensemble -> ajouter vos fichiers de police).

3
HugglesNL

Depuis XCode 9.4, XCode ne respecte toujours pas les polices directement dans le storyboard. Vous pouvez les voir au moment de la conception, mais pas au moment de l'exécution. Si vous utilisez l’API fontWithName, vous apprendrez qu’elle renvoie nil, mais lorsqu’il est utilisé dans storyboard/xib, il n’ya aucun moyen de savoir pourquoi elle n’apparaît pas.

  • Le seul moyen de vous assurer qu'il fonctionne facilement à partir de Storyboard/XIB au moment de l'exécution consiste à ajouter .ttc/.ttf dans Copy Bundle Resources Build Phase. 

  • Depuis la version 9.4, l’ajout de noms de fichiers de polices à info.plist ne semble plus une obligation.

0
Nirav Bhatt

la solution de redent84 était géniale!

Je voudrais juste ajouter une amélioration, ajouter la catégorie sur NSObject, de sorte que vous ne devez le faire qu'une fois.

NSObject + CustomFont.h

#import <Foundation/Foundation.h>

@interface NSObject (CustomFont)

@property (strong, nonatomic) NSString *fontName;
@property (strong, nonatomic) UIFont *font;

@end

NSObject + CustomFont.m

#import "NSObject+CustomFont.h"

@implementation NSObject (CustomFont)

@dynamic font;

- (NSString *)fontName
{
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName
{
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end
0
Rodrigo Ruiz

Aucune de ces solutions n'a fonctionné pour moi, mais cela a fonctionné.

#import <UIKit/UIKit.h>

@interface UILabelEx : UILabel


@end

#import "UILabelEx.h"
#import "Constants.h"

@implementation UILabelEx

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];

    self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];   
}
@end
0
Jules