web-dev-qa-db-fra.com

Comment puis-je obtenir le nom de la police d'un fichier otf ou ttf?

J'ai utilisé une police personnalisée dans mon application précédente.

Le nom du fichier était "ProximaNova-Regular.otf" et pour charger la police que je viens d'utiliser ...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

Cela a parfaitement fonctionné.

Maintenant, dans cette nouvelle application, j'ai trois fichiers de polices ...

Dude_Willie.otf
Impact
handsean.ttf

Mais je ne sais pas comment les charger.

J'ai essayé

[UIFont fontWithName:<the file name> size:20];

Mais cela revient simplement à utiliser Helvetica.

Comment puis-je trouver quel nom utiliser?

64
Fogmeister

Suivez ces quatre étapes simples pour ajouter et utiliser une nouvelle police dans votre application iOS:

  • Ajoutez your_new_font.ttf ou your_new_font.otf à votre projet Xcode
  • Dans le fichier info.plist de votre projet, ajoutez une nouvelle entrée pour your_new_font.ttf ou your_new_font.otf dans le tableau UIAppFonts (le texte en clair pour celui-ci est 'Polices fournies par l'application')
  • À ce stade, je vous recommande d’ajouter ce bloc temporaire de code de débogage pour vider toutes les polices accessibles par votre application, y compris votre tout nouveau your_new_font:
for(NSString *fontfamilyname in [UIFont familyNames])
{
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
    {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • Dans la sortie de débogage, recherchez les noms de famille et de police de votre nouvelle police. Passez tout ce qui est affiché comme nom de "police" correspondant à votre nouvelle famille de polices (il peut y avoir plus d'une "police" associée à votre nouvelle famille de polices) à UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20] et vous devriez être en affaires!
55
John Jacecko

Faites un clic droit sur le TTF -> Obtenir des informations

"Nom complet" est ce que vous recherchez.

C'est ce qui a fonctionné pour moi avec les TTF.

Modifier:

Je viens d'utiliser une police qui a un nom différent du "Nom complet" dans Obtenir des informations.

Pour la compilation de cette réponse, si la vérification rapide ci-dessus ne fonctionne pas, exécutez ce code dans votre projet:

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

Et recherchez le nom correct de la police que vous souhaitez utiliser.

Swift 3.0 code:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}
114
Segev
  • Installer la police 
  • Ouvrez l'application Font Book sur votre Mac 
  • Sélectionnez la police et cliquez sur le bouton 'info' 
  • Le nom que vous recherchez est PostScript name 

 example

33
Elin Gersin

Pour utiliser les polices dans iOS, vous devez charger la police en fonction de son nom Nom complet (Nom PostScript), qui est parfois (et est généralement) différent de la police NOM DU FICHIER.

Imaginez-vous en train de renommer le fichier de police "Arial-regular.ttf" en "foo.ttf". La police contenue dans le fichier de police que vous venez de renommer est toujours "Arial-régulier".

Il existe de bonnes méthodes de programmation pour obtenir le nom de la police déjà sur ce fil, mais mon approche est différente en utilisant la ligne de commande.

Si vous êtes sur Mac ou Linux, exécutez simplement ce script à partir de la ligne de commande dans le répertoire contenant vos polices personnalisées (utilisez l'utilitaire fc-scan de fontconfig qui est probablement déjà installé, mais vous pouvez également l'installer. via homebrew: brew install fontconfig):

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

Voici une capture d'écran de la commande ci-dessus s'exécutant sur mon répertoire ~/Library/Fonts:

 enter image description here

Le script ci-dessus parcourt tous les fichiers .ttf et .otf du répertoire en cours, puis affiche le Nom PostScript pour chaque police que vous pouvez utiliser pour référencer le fichier de police dans XCode ou ailleurs.

Si vous souhaitez obtenir des informations supplémentaires avec des informations supplémentaires (PostScriptName, Nom du fichier) et des codes de couleur, vous pouvez exécuter ce script alternatif:

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

 enter image description here

C’est un peu plus rapide que le copier-coller de votre fichier AppDelegate.m pour imprimer les noms à chaque fois que vous souhaitez ajouter un nouveau fichier de police, méthode couramment utilisée. Il est également plus rapide que d’ouvrir la police dans FontBook inspecter le nom PostScript.

CONSEIL UTILE: Si vous appelez le script ci-dessus dans votre terminal, il vous suffit de taper une seule commande pour obtenir tous les noms de police PostScript de tous les fichiers du répertoire en cours (ma fonction est appelée fontnames donc tout ce que je dois faire est de taper fontnames au terminal dans le répertoire contenant les polices, et les noms PostScript seront automatiquement imprimés, vous gagnerez du temps dans votre processus de développement et aurez ce script pratique prêt à être utilisé à tout moment il.

J'espère que cela t'aides!

31
radiovisual

Vous voulez savoir comment obtenir un nom pour cela: -

  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

espérons que cela vous aide ...

6

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }
5
Sekhar22

Après avoir ajouté vos polices à votre projet/application, ajoutez ce code (probablement uniquement dans la méthode du délégué d'application didFinishLaunchingWithOptions) afin d'imprimer toutes les polices disponibles pour votre application. À partir de cette liste, vous devriez pouvoir identifier la police que vous recherchez. N'oubliez pas de supprimer le code inutile après.

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}
4
Oliver Pearmain

Swift 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }
3
Harry Ng

Swift 4.0+ solution

    for fontFamilyName in UIFont.familyNames {
        print("family: \(fontFamilyName)\n")

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

Est-ce que la sortie:

famille: Apple SD Gothic Neo

police: AppleSDGothicNeo-Thin

police: AppleSDGothicNeo-Light

3
JaredH

Vous pouvez également utiliser otfinfo --info arial.ttf pour obtenir le nom depuis la ligne de commande. Le nom postscript est celui que vous devez transmettre au constructeur UIFont.

2
Moritz

Si vous souhaitez rechercher le nom de la police pour un fichier de police donné par programme:

import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

Remplacez-le par vos propres objets Error et jetables selon vos besoins.

2
Robert

Enregistrez les noms de famille du fichier de police, puis accédez aux polices:

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

J'espère que ça vous aide.

1
Nishant Tyagi

Une autre astuce "rapide et pratique" qui n'implique pas l'analyse de toutes les polices par défaut existant sur l'émulateur ou le périphérique consiste à utiliser la police pour un élément de votre story-board. Ensuite, si vous éditez le storyboard avec un éditeur de texte, vous pouvez voir les polices utilisées avec les noms "internes" si vous recherchez la balise "customFonts":

<customFonts key="customFonts">
    <array key="Linotype - AvenirNextLTPro-Bold.otf">
        <string>AvenirNextLTPro-Bold</string>
    </array>
    <array key="Linotype - AvenirNextLTPro-Regular.otf">
        <string>AvenirNextLTPro-Regular</string>
    </array>
    <array key="TradeGothicLTPro-BdCn20.otf">
        <string>TradeGothicLTPro-BdCn20</string>
    </array>
</customFonts>
1
Kaolin Fire

Liste des noms de polices et des familles pour macOS avec Swift 4.1 :

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }
0
Ben Stahl