web-dev-qa-db-fra.com

Polices personnalisées dans iOS 7

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 ceci https://github.com/deni2s/IBCustomFonts mais je ne peux pas le faire fonctionner avec cette police http://www.fontspace.com/freaky- polices/emulogic

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

102
José María

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 "Polices fournies par l'application" dans votre plist et dans élément 0 copiez le nom de fichier exact de la police que vous avez copiée dans l’extension WITH Support files. 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. Faites cela en sélectionnant votre cible , puis phases de construction , puis Copier les ressources du paquet . Si vous ne voyez pas votre police ici, faites-la glisser de Fichiers de support .

Enfin, vous souhaitez répertorier toutes vos polices au démarrage de l’application afin de voir le nom utilisable de votre police. Vous ferez ça avec ce petit bout 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 en tenir compte, mais définissez par programme la police pour iOS7 et sélectionnez-la dans le générateur d'interface xCode6. PS Le générateur d'interface de 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, à la vôtre.

277
jovanjovanovic

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. Allez à votre projet dans le navigateur de projet, cliquez sur le nom du projet et allez à "phases de construction" puis regardez en bas dans "Copier les ressources du paquet" allez au bas, il y a beaucoup de fichiers et cherchez le signe "+". Une fenêtre contextuelle s'ouvrira avec vos fichiers de projet. Recherchez votre fichier de police et ajoutez-le à l'ensemble.
  3. Enfin, vérifiez 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 pour montrer la police. Vérifiez le titre de la fenêtre, c'est le nom de la police que vous devez utiliser.

Et conseil, ajoutez ce nom sous forme de 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 celle-ci n'a pas été copiée dans le bundle d'applications. Ainsi, lorsque l'application a été 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 :)

24
zago

Pour y parvenir à Swift

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

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

Je n'ai jamais réussi à obtenir ces réponses au travail 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 est de créer une étiquette cachée dans le story-board qui utilise la police. Je peux utiliser la police par programmation. Bizarre et hacky je sais mais cela a fonctionné pour moi.

5
Stuart Clark

Si aucune des méthodes ci-dessus ne vous convient ET si vous utilisez votre police personnalisée "uniquement par programmation" (c’est-à-dire que vous ne l’avez utilisée dans aucune xib), vous devrez l’utiliser au moins une fois dans une xib, n’importe où. .

(PS Stuart Clark - déjà répondu à cela, donc pas de crédit pour moi s'il vous plaît. Cependant, j'ai décidé de reformuler et de le poster comme une réponse séparée, parce que j'ai raté 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 une xib, et j’ai vu que cela fonctionnait ailleurs par programmation, mais lorsque j’ai supprimé la police de xib, elle ne fonctionnait plus par programmation.)

3
Wojtek

Si vous utilisez Xcode 6, c'est aussi simple que cela. Ajoutez simplement un dossier font dans votre projet, ajoutez vos polices dans le dossier, et le tour est joué.

enter image description here

3
Idris

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)");
}
2
Gavin Williams

Peut-être une solution rapide - cela a été fait pour moi lorsque la police a déjà fonctionné, mais un nouveau, par exemple. L'étiquette n'affichait pas la police souhaitée:

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

0
brainray
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
0
herry.master