Polices personnalisées dans iOS 7


102

Je développe un jeu et j'aimerais utiliser une police personnalisée dans mon application. J'utilise SpriteKit pour cela, si c'est important. J'ai essayé d'utiliser cette https://github.com/deni2s/IBCustomFonts mais je ne parviens pas à la faire fonctionner avec cette police http://www.fontspace.com/freaky-fonts/emulogic

J'ai essayé diverses choses, et j'ai enregistré la police sur le fichier info.plist de l'application ... Est-ce que quelqu'un sait ce qui se passe?


Êtes-vous sûr d'utiliser le nom correct de la police lorsque vous l'utilisez dans votre code?
Nick

1
ce blog peut vous être utile codewithchris.com
Xu Yin

Réponses:


277

Tout d'abord, je suppose que SpriteKit ne fait aucune différence.

  1. Vous devez copier votre police au format .otf ou .ttf dans votre projet. Par exemple dans Fichiers de support.
  2. Vous devez modifier le fichier .plist . Ajoutez la clé «Polices fournies par l'application» dans votre plist et dans l' élément 0 copiez le nom de fichier exact de la police que vous avez copiée dans vos fichiers de support avec l'extension. Par exemple: "JosefinSansStd-Light_0.otf"
  3. Assurez-vous que la police que vous avez importée dans votre application est intégrée à l'application elle-même. Pour ce faire, sélectionnez votre cible , puis Build Phases , puis Copier les ressources du bundle . Si vous ne voyez pas votre police ici, faites-la glisser depuis Fichiers de support .

Enfin, vous souhaitez répertorier toutes vos polices lorsque l'application démarre, juste pour voir le nom utilisable pour votre police. Vous ferez cela avec ce petit morceau de code:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
}

Recherchez votre police dans les résultats imprimés, par exemple, je rechercherais "Josefin" et je verrais que le nom de police réel est "JosefinSansStd-Light". Après cela, vous ne devez utiliser cette police que par:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

Dans iOS8, vous ajoutez vos polices directement au projet et elles sont visibles dans le générateur d'interface. Modifiez votre code pour tenir compte de cela, mais définissez la police par programme pour iOS7 et sélectionnez-la dans le générateur d'interface xCode6. PS. Le générateur d'interface dans xCode6 vous donne le nom de police correct que vous pouvez copier-coller dans le code ci-dessous.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    }

J'espère que cela aide, applaudissements.


Merci! J? ai compris! Le problème était que je ne l'ajouterais pas aux fichiers de support, donc il ne se chargeait pas: P
José María

1
J'ai dû utiliser la clé plist deUIAppFonts
Mike Flynn

1
J'ai recréé mon application, l'ensemble du projet d'iOS7 / Xcode 5.1.1 dans un projet iOS8 / Xcode 6.0. La police personnalisée ne s'affichait pas jusqu'à ce que je fasse l'étape 2.. Explication Gr8!
MB_iOSDeveloper

1
Le même code pour obtenir les noms de polices dans Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert

1
Quelques codes for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
SWIFT

24

Aucun problème pour utiliser des polices personnalisées, je l'ai fait. Suivez ces étapes:

  1. Enregistrez la police dans votre info.plist en ajoutant l'entrée «Polices fournies par l'application». Mettez le nom du fichier de police, pas le nom de la police. Comme font.ttf (je pense que vous l'avez déjà fait)
  2. Accédez à votre projet sur le navigateur de projet, cliquez sur le nom du projet et allez dans "phases de construction" puis regardez vers le bas dans "Copier les ressources du bundle" allez en bas, il y a beaucoup de fichiers et recherchez le signe "+". Une fenêtre contextuelle s'ouvrira avec vos fichiers de projet. Recherchez votre fichier de police et ajoutez-le à l'ensemble.
  3. Vérifiez enfin le nom de la police. Lorsque vous l'utilisez dans votre code, vous devez utiliser le nom de la police et non le nom du fichier. Pour connaître le nom de la police, double-cliquez sur le fichier de police dans le Finder et une fenêtre s'ouvrira affichant la police. Vérifiez ce titre de fenêtre, c'est le nom de la police que vous devez utiliser.

Et conseil, ajoutez ce nom en tant que macro dans votre fichier ..Prefix.pch. Il sera plus facile de l'utiliser dans votre projet si vous devez utiliser la police plusieurs fois.

Le problème que je pense que vous avez eu est que vous avez correctement enregistré la police mais qu'elle n'a pas été copiée dans le bundle d'applications. Ainsi, lorsque l'application s'est exécutée, elle n'a pas pu trouver la police. C'est pourquoi l'étape 2 est importante. J'ai passé beaucoup de temps à essayer de comprendre cela la première fois :)


2
La clé pour moi était le titre de la police. Merci!
Oscar

20

Pour y parvenir rapidement

Si vous souhaitez répertorier toutes vos polices au démarrage de l'application, simplement pour voir le nom utilisable pour votre police. Vous pouvez le faire avec ce petit morceau de code:

    UIFont.familyNames.forEach {
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    }

ou avecUIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
Daniel

5

Je n'ai jamais été en mesure de faire fonctionner ces réponses après avoir essayé plusieurs fois. La seule façon pour moi d'avoir une police personnalisée pour suivre les instructions de la réponse acceptée, puis créer une étiquette cachée dans le storyboard qui utilise la police. Le Je peux utiliser la police par programme. Bizarre et hacky je sais mais ça a marché pour moi.


1
vous avez tout à fait raison. J'ai tout regardé dans de nombreux didacticiels, y compris le plist, la coche pour cibler le projet, les phases de construction et j'ai finalement trouvé le nom de famille de polices correct, mais cela ne fonctionnait toujours pas. Ensuite, j'ai ajouté une étiquette cachée comme vous le dites et finalement elle est apparue. J'utilise Xcode 7.2 et ça doit être un bug.
DrZ214

3

Si vous êtes dans Xcode 6, c'est aussi simple que possible. Ajoutez simplement un fontdossier à votre projet, ajoutez vos polices dans le dossier et vous êtes prêt à partir.

entrez la description de l'image ici


7
Assurez-vous de l'ajouter également à votre cible. Sneaky hobbit Xcode.
Matt Parkins

3

Si aucune des méthodes ci-dessus n'a fonctionné pour vous, ET que vous n'utilisez votre police personnalisée que "par programme" (c'est-à-dire que vous ne l'avez utilisée dans aucun xib), vous devrez l'utiliser au moins une fois quelque part dans un xib, n'importe où .

(PS Stuart Clark - a déjà répondu à cela, donc aucun crédit pour moi s'il vous plaît. Cependant, j'ai décidé de reformuler et de l'afficher comme une réponse distincte, parce que j'ai manqué sa réponse, ce n'était pas clair pour moi quand je l'ai lu. J'ai trouvé cette solution par hasard lorsque je testais la police personnalisée dans un xib, et j'ai vu que cela fonctionnait ailleurs par programme, mais lorsque j'ai supprimé la police du xib, elle a cessé de fonctionner par programme.)


2

Mis à jour pour Swift 3.

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies {
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");
}

0

Peut-être une solution rapide - cela l'a fait pour moi lorsque la police a déjà fonctionné, mais une nouvelle étiquette par exemple n'a pas montré la police souhaitée:

dossier de données dérivé propre, nettoyé en profondeur et vide.


0
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];
}
@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.