Как проверить, доступен ли шрифт в версии 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);
    }
}