55 votes

Comment vérifier si une police est disponible dans la version d'iOS ?

Je travaille actuellement sur une application qui utilise la police "ChalkboardSE-Regular" et ma cible de déploiement est la 4.0+. Cette police n'était pas disponible en 4.1 mais elle est prise en charge en 4.3. Quelle serait la meilleure façon de vérifier si la police existe et, si ce n'est pas le cas, d'utiliser une autre police prise en charge sur les versions <4.1 d'iOS ? [UIFont familyName] renvoie une liste de ces polices "Chalkboard SE".

Merci d'avance !

T

114voto

Steve HHH Points 3088

[UIFont familyName] est pris en charge depuis iPhone OS 2.0 (avant 2.0, les applications tierces n'étaient pas autorisées sur l'iPhone ou l'iPod touch). Je l'utiliserais donc pour vérifier si une famille de polices existe sur l'appareil actuel et, si elle n'existe pas, j'utiliserais une police de secours appropriée pour cette version d'iOS. Voici la liste de John Gruber des polices de l'iPhone original en 2007 (comparée aux polices de Mac OS X de l'époque). Je ne les ai pas toutes vérifiées, mais les polices iOS que j'ai vérifiées sont toujours présentes dans iOS 5 :

Voici un exemple d'utilisation de [UIFont familyName] :

NSLog (@"Font families: %@", [UIFont familyNames]);

Cela produira une liste comme celle-ci :

Familles de polices : ( Thonburi, "Snell Roundhand", "Academy Engraved LET", ... et cetera.

Une fois que vous connaissez le nom de famille, vous pouvez utiliser la fonction UIFont méthode de classe fontNamesForFamilyName pour obtenir un tableau NSArray contenant les noms de toutes les polices de la famille. Par exemple :

NSLog (@"Courier New family fonts: %@", [UIFont fontNamesForFamilyName:@"Courier New"]);

Cela produira une liste comme celle-ci :

Polices de la famille Courier New : ( CourierNewPSMT, "CourierNewPS-BoldMT", "CourierNewPS-BoldItalicMT", "CourierNewPS-ItalicMT )

L'exemple de code suivant imprime une liste de chaque police de chaque famille sur le périphérique actuel :

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);
}

Pour plus d'informations, consultez le document de référence du développeur iOS pour l'outil de gestion de l'environnement. UIFont méthodes de classe noms de famille et FontNamesForFamilyName : .

53voto

Alex MGD Points 412

Si vous utilisez Swift, vous pouvez imprimer toutes les polices (voir ci-dessous). Vous pouvez également vérifier si la police existe.

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

    for name in UIFont.fontNames(forFamilyName: family) {
        print("\(name)")
    }
}

14voto

Beau Young Points 419

Swift 5.x

Oubliez les boucles for, c'est le moyen le plus simple de voir les polices prises en charge par iOS.

Il suffit d'exécuter l'un des éléments suivants dans une cour de récréation.


Noms de famille uniquement

Entrée

dump(UIFont.familyNames)

Sortie

 75 elements
  - "Copperplate"
  - "Heiti SC"
  - "Kohinoor Telugu"
  ...

Noms de police uniquement

Entrée

dump(UIFont.familyNames.compactMap { UIFont.fontNames(forFamilyName: $0) })    

Sortie

 248 elements
  - "Copperplate-Light"
  - "Copperplate"
  - "Copperplate-Bold"
  ...

Noms de police pour le nom de famille spécifié

Entrée

dump(UIFont.fontNames(forFamilyName: "Helvetica Neue"))

Sortie

 14 elements
  - "HelveticaNeue-Italic"
  - "HelveticaNeue-Bold"
  - "HelveticaNeue-UltraLight"
  - "HelveticaNeue-CondensedBlack"
  ...

14voto

matt Points 60113

Cette police n'était pas disponible dans la version 4.1 mais elle est prise en charge dans la version 4.3. Quelle serait la meilleure façon de vérifier si cette police existe ?

Il suffit de demander la police de la manière habituelle en utilisant UIFont* f = [UIFont fontWithName:... size:...]; . Si la police n'est pas disponible, le résultat ( f ) sera nul.

(Une façon de garantir la disponibilité d'une police est de l'inclure dans le paquet d'applications...)

0 votes

Pouvez-vous nous en dire plus ? ("l'inclure dans le paquet d'applications") Comment le faire, où (à partir de) pouvez-vous le copier, cela ne va-t-il pas violer (une douzaine de) lois/droits d'auteur/etc ? Je pose la question parce que dans l'iOS6 la police MarkerFelt a un "bug". La lettre grecque s (sigma final) est affichée comme la minuscule Zeta... Puis-je inclure la police MarkerFelt iOS5 dans mon application ? Et comment dois-je m'y prendre ?

0 votes

Une police est comme toute autre ressource dans votre projet. Si elle est incluse dans la phase de construction de Copy Bundle Resources, elle est, euh, copiée dans votre bundle. Voir mon livre : apeth.com/iOSBook/ch06.html#_the_target . Notez que vous devrez définir la clé UIAppFonts dans votre Info.plist, afin d'avertir le moteur d'exécution qu'il existe une police dans votre bundle qui doit être récupérée.

3voto

Jiri Trecak Points 3936

Pour iOS9 / Swift 2.0, rien de ce qui précède ne fonctionnera car la syntaxe a un peu changé. Je préfère aussi personnellement utiliser des extensions (j'ai choisi d'en créer une pour UIFont, car elle correspond le mieux et j'ai modifié la réponse @API car c'était la meilleure) :

extension UIFont {

    static func availableFonts() {

        // Get all fonts families
        for family in UIFont.familyNames() {
            NSLog("\(family)")

            // Show all fonts for any given family
            for name in UIFont.fontNamesForFamilyName(family) {
                NSLog("   \(name)")
            }
        }
    }
} 

Maintenant, vous pouvez simplement appeler :

UIFont.availableFonts()

Et il vous indiquera toutes les polices de caractères sous la forme de

: Bangla Sangam MN
:    BanglaSangamMN-Bold
:    BanglaSangamMN
: Zapfino
:    Zapfino

J'espère que cela vous aidera !

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