Как проверить, доступен ли шрифт в версии iOS?
В настоящее время я работаю над приложением, использующим шрифт "ChalkboardSE-Regular", а моя цель развертывания - 4.0+. Этот шрифт недоступен в 4.1, но поддерживается в 4.3. Какой был бы лучший способ проверить, существует ли шрифт, а если нет, используйте другой поддерживаемый шрифт в версиях iOS версии 4.1. [UIFont familyName] возвращает список этих шрифтов "Chalkboard SE"
Спасибо заранее!
Т
Ответы
Ответ 1
[UIFont familyName]
поддерживается обратно в iPhone OS 2.0 (до 2.0 сторонних приложений не разрешалось на iPhone или iPod touch), поэтому я бы использовал это, чтобы проверить, существует ли семейство шрифтов на текущем устройстве, и если он не существует, используйте подходящий шрифт возврата для этой версии iOS. Здесь John Gruber список шрифтов iPhone от оригинального iPhone в 2007 году (в отличие от шрифтов в Mac OS X дня). Я не проверял их все, но шрифты iOS, которые я проверил, все еще находятся в iOS 5:
Вот пример использования [UIFont familyName]
:
NSLog (@"Font families: %@", [UIFont familyNames]);
Это приведет к созданию списка следующего вида:
Семейство шрифтов: ( Thonburi, "Snell Roundhand", "Академия выгравирована LET",... и т.д.
Как только вы узнаете имя семейства, вы можете использовать метод класса UIFont
fontNamesForFamilyName
, чтобы получить NSArray имен всех шрифтов в семействе. Например:
NSLog (@"Courier New family fonts: %@", [UIFont fontNamesForFamilyName:@"Courier New"]);
Это создаст такой список:
Курьер Новые семейные шрифты: ( CourierNewPSMT, "CourierNewPS-BoldMT", "CourierNewPS-BoldItalicMT", "CourierNewPS-ItalicMT" )
Следующий примерный код печатает список каждого шрифта в каждом семействе текущего устройства:
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);
}
За дополнительной информацией обратитесь к справочному документу iOS Developer Reference для методов класса UIFont
familyNames и fontNamesForFamilyName:.
Ответ 2
Если вы используете Swift, вы можете распечатать все шрифты (см. ниже). Вы также можете проверить, существует ли шрифт.
for family in UIFont.familyNames {
print("\(family)")
for name in UIFont.fontNames(forFamilyName: family) {
print(" \(name)")
}
}
Ответ 3
Этот шрифт не был доступен в 4.1, но он поддерживается в 4.3. Какой был бы лучший способ проверить, существует ли шрифт
Просто попросите шрифт обычным способом с помощью UIFont* f = [UIFont fontWithName:... size:...];
. Если шрифт недоступен, результат (f
) будет равен нулю.
(Один из способов гарантировать наличие шрифта - включить его в комплект приложения...)
Ответ 4
Swift 3.x
Забудьте об этих for-loops, это самый простой способ увидеть шрифты, поддерживаемые iOS.
Просто запустите любое из следующих действий на игровой площадке.
Только семейные имена
Ввод
dump(UIFont.familyNames)
Выход
▿ 75 elements
- "Copperplate"
- "Heiti SC"
- "Kohinoor Telugu"
...
Только имена шрифтов
Ввод
dump(UIFont.familyNames.flatMap { UIFont.fontNames(forFamilyName: $0) })
Выход
▿ 248 elements
- "Copperplate-Light"
- "Copperplate"
- "Copperplate-Bold"
...
Имена шрифтов для указанного имени семьи
Ввод
dump(UIFont.fontNames(forFamilyName: "Helvetica Neue"))
Выход
▿ 14 elements
- "HelveticaNeue-Italic"
- "HelveticaNeue-Bold"
- "HelveticaNeue-UltraLight"
- "HelveticaNeue-CondensedBlack"
...
Ответ 5
Это то, что я сделал на объективе c, чтобы узнать, доступен ли шрифт или нет
NSFont *font = [NSFont fontWithName:@"thefont" size:25.0];
if (font==nil) {
// thefont is available
} else {
// thefont is not available
}
Ответ 6
Для iOS9/Swift 2.0 ни один из вышеперечисленных действий не будет работать, так как синтаксис немного изменился. Я также лично предпочитаю использовать расширение (я решил создать его для UIFont, так как он соответствует лучшему и измененному ответу @API, поскольку он был лучшим):
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)")
}
}
}
}
Теперь вы можете просто позвонить:
UIFont.availableFonts()
И он расскажет вам все шрифты в форме
: Bangla Sangam MN
: BanglaSangamMN-Bold
: BanglaSangamMN
: Zapfino
: Zapfino
Надеюсь, что это поможет!
Ответ 7
Быстрая версия:
UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print(" \($0)") }) })
Ответ 8
Ниже приведена конверсия ответа Стива на код Swift (для быстрого копирования и вставки):
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)
}
Ответ 9
Попробуйте инициализировать это имя шрифта, и если он nil
сделает что-то еще. Быстрый код:
if let font = UIFont(name: name, size: size) { // ok } else { // not ok }
Ответ 10
Для objective-c
for (NSString *family in UIFont.familyNames) {
NSLog(@"family %@",family);
for (NSString *name in [UIFont fontNamesForFamilyName:family]) {
NSLog(@" name = %@",name);
}
}