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
[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 UIFont
fontNamesForFamilyName
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 UIFont
familyNames et fontNamesForFamilyName: .
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)")
}
}
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 ...)
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.
Contribution
dump(UIFont.familyNames)
Sortie
▿ 75 elements
- "Copperplate"
- "Heiti SC"
- "Kohinoor Telugu"
...
Contribution
dump(UIFont.familyNames.flatMap { UIFont.fontNames(forFamilyName: $0) })
Sortie
▿ 248 elements
- "Copperplate-Light"
- "Copperplate"
- "Copperplate-Bold"
...
Contribution
dump(UIFont.fontNames(forFamilyName: "Helvetica Neue"))
Sortie
▿ 14 elements
- "HelveticaNeue-Italic"
- "HelveticaNeue-Bold"
- "HelveticaNeue-UltraLight"
- "HelveticaNeue-CondensedBlack"
...
Version rapide:
UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print(" \($0)") }) })
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!
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
}
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.
Swift 4.x
UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print(" \($0)") }) })
Pour objectif-c
for (NSString *family in UIFont.familyNames) {
NSLog(@"family %@",family);
for (NSString *name in [UIFont fontNamesForFamilyName:family]) {
NSLog(@" name = %@",name);
}
}
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)
}