67 votes

Police personnalisée dans un storyboard?

J'ai une police ajouté à mon projet iOS. C'est dans le projet et copiées lorsque le projet s'appuie. Il semble être une police valide, et s'affichera si j'ai la liste de toutes les polices installées sur l'appareil par le biais de l'application. J'ai le plist correctement configuré pour inclure la police. Je n'arrive pas à obtenir le trouver à se manifester pour l'utiliser dans mon texte les commandes, les boutons, etc dans Xcode 4.2 de la section storyboard. De plus, il ne semble pas me permettre de taper le nom de la police, il m'oblige à utiliser la boîte de dialogue police. J'ai tenté d'installer cette police dans le système, mais ne semble pas à l'obtenir à afficher dans cette liste. Ai-je besoin de le faire dans le code uniquement ou puis-je le faire par le biais de l'interface scénario?

Notez que je peux obtenir ce travail dans le code, mais il serait beaucoup plus pratique de le faire via la table de montage séquentiel.

147voto

redent84 Points 4215

Je sais que cette question est assez vieux, mais j'ai eu du mal à trouver un moyen facile de spécifier une police personnalisée sous forme d'un Storyboard (ou Interface Builder) facilement pour iOS 5 et j'ai trouvé une solution très pratique.

Tout d'abord, assurez-vous que vous avez ajouté la police pour le projet en suivant ce tutoriel. Rappelez-vous aussi que UINavigationBar, UITabBar et UISegmentedControl police personnalisée peut être spécifié à l'aide de l' setTitleTextAttributes: méthode de la UIAppearance proxy.

Ajouter les catégories ci-dessous pour le projet de UIButton, UITextField, UILabel et tout autre élément composant qui a besoin d'une police personnalisée. Les catégories de simplement mettre en œuvre une nouvelle propriété, fontName qui change la police de l'élément tout en maintenant la taille de la police.

Pour spécifier la police dans le Storyboard, il suffit de sélectionner l'élément souhaité (label, button, textview, etc) et d'ajouter un Utilisateur Défini Exécution de l'Attribut avec la Clé de Chemin ensemble au nom de la fonte de type Chaîne de valeur et avec le nom de votre police personnalisée.

Custom font Storyboard

Et voilà, vous n'avez même pas besoin d'importer les catégories. De cette façon, vous n'avez pas besoin d'une sortie pour chaque composant de l'INTERFACE utilisateur qui nécessite une police personnalisée et vous n'avez pas besoin de code manuellement.

Prendre en compte le fait que la police de ne pas s'afficher dans la table de montage séquentiel, mais vous le verrez lors de l'exécution sur votre appareil ou sur simulateur.


La catégorie fichiers

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 comme un seul fichier.

Dépannage

Si vous exécutez à l'encontre des erreurs d'exécution, parce que l' fontName de la propriété n'est pas spécifiée, il suffit d'ajouter le drapeau de l' -all_load sous d'Autres Drapeaux de l'éditeur de liens dans les paramètres de projet pour forcer l'éditeur de liens pour inclure les catégories.

5voto

Dan Points 288

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 de SO à ce sujet. Polices non affichées dans Interface Builder

0voto

Matt Quiros Points 2236

Je sais que la question est à propos de la configuration des polices personnalisées dans un storyboard, mais l'on a accepté la réponse est évidemment beaucoup plus de code.

Voici l'affaire: affecter un entier tag de la vue sur laquelle vous souhaitez une police personnalisée, et de définir la police par programmation. C'est la meilleure façon d'aller. Donc, si j'ai mis en place un affichage de tableau de cellules de l'IB et d'avoir un UILabel à l'intérieur, je vais vous donner l'étiquette 1000 comme une balise et d'effectuer les opérations suivantes en cellForRowAtIndexPath::

UILabel *label = [cell.contentView viewWithTag:1000];
label.font = [UIFont fontWithName:@"custom-font" size:20];

Plus simple, non?

0voto

Rodrigo Ruiz Points 144

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
 

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