web-dev-qa-db-fra.com

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 4.0+. Cette police n'était pas disponible dans 4.1 mais elle est prise en charge dans 4.3. Quel serait le meilleur moyen de vérifier si la police existe et si ce n’est pas le cas, utilisez 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

49
tg2007

[UIFont familyName] est compatible avec l'iPhone OS 2.0 (avant la version 2.0, les applications tierces n'étaient pas autorisées sur l'iPhone ou l'iPod touch). J'utiliserais donc cette information pour vérifier si une famille de polices existe sur le périphérique actuel et si elle ne le fait pas. t existent, utilisez une police de secours appropriée pour cette version d’iOS. Voici la liste de John Gruber des polices iPhone de l'iPhone d'origine en 2007 (par opposition aux polices de Mac OS X du jour). Je ne les ai pas tous vérifiés, mais les polices iOS que j'ai vérifiées sont toujours dans iOS 5:

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

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

Cela produira une liste comme ceci:

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

Une fois que vous connaissez le nom de famille, vous pouvez utiliser la méthode de classe UIFontfontNamesForFamilyName pour obtenir un NSArray des 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:

Courier Nouvelles familles de polices: ( CourierNewPSMT, "CourierNewPS-BoldMT", "CourierNewPS-BoldItalicMT", "CourierNewPS-ItalicMT" ).

L'exemple de code suivant imprime une liste de chaque police de chaque famille du 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 les méthodes de classe UIFontfamilyNames et fontNamesForFamilyName: .

107
Steve HHH

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)")
    }
}
35

Cette police n'était pas disponible dans 4.1 mais elle est prise en charge dans 4.3. Quel serait le meilleur moyen de vérifier si la police existe?

Demandez simplement 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 consiste à l'inclure dans le bundle d'applications ...)

14
matt

Swift 3.x

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

Il suffit de lancer l'un des éléments suivants dans une aire de jeux.


Noms de famille seulement

Contribution

dump(UIFont.familyNames)

Sortie

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

Noms de police uniquement

Contribution

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

Sortie

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

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

Contribution

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

Sortie

▿ 14 elements
  - "HelveticaNeue-Italic"
  - "HelveticaNeue-Bold"
  - "HelveticaNeue-UltraLight"
  - "HelveticaNeue-CondensedBlack"
  ...
5
Beau Nouvelle

Version rapide:

UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print("     \($0)") }) })
2
eMdOS

Pour iOS9/Swift 2.0, rien de ce qui précède ne fonctionnera car la syntaxe a légèrement changé. Personnellement, je préfère aussi utiliser l'extension (j'ai choisi d'en créer une pour UIFont, car elle correspond à la meilleure réponse @API modifiée, 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 dira toutes les polices sous forme de 

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

J'espère que ça aide!

2
Jiri Trecak

C'est ce que j'ai fait sur Objective C pour savoir si la police est disponible ou non

NSFont *font = [NSFont fontWithName:@"thefont" size:25.0];
if (font==nil) {
    // thefont is available
} else {
    // thefont is not available
}
2
disaster code

Au lieu d'écrire une seule ligne de code, vous pouvez simplement ouvrir http://iosfonts.com et vérifier la disponibilité en fonction de la prise en charge de votre version iOS. Vous pouvez également savoir à quoi cela ressemble.

 http://iosfonts.com Preview Feature

0
Sauvik Dolui

Swift 4.x

UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print("     \($0)") }) })
0
Mercurial

Pour objectif-c

for (NSString *family in UIFont.familyNames) {
    NSLog(@"family %@",family);
    for (NSString *name in [UIFont fontNamesForFamilyName:family]) {
        NSLog(@"      name = %@",name);
    }
}
0
Obadah Shatnawi

Voici une conversion de Steves answer en code Swift (pour copier et coller rapidement):

    var fontFamilies = UIFont.familyNames()

    for (var i:Int = 0; i < fontFamilies.count; i++) {
        var fontFamily: NSString = fontFamilies[i] as NSString
        var fontNames: NSArray = UIFont.fontNamesForFamilyName(fontFamilies[i] as String) as NSArray

        NSLog ("%@: %@", fontFamily, fontNames)
    }
0
Pontus