Как проверить, доступен ли шрифт в версии iOS? - PullRequest
49 голосов
/ 16 декабря 2011

В настоящее время я работаю над приложением, в котором используется шрифт ChalkboardSE-Regular, и моя цель развертывания - 4.0+.Этот шрифт не был доступен в 4.1, но поддерживается в 4.3.Как лучше всего проверить, существует ли шрифт, а если нет, используйте другой поддерживаемый шрифт в версиях iOS <4.1.[UIFont familyName] возвращает список этих шрифтов "Chalkboard SE" </p>

Заранее спасибо!

T

Ответы [ 12 ]

109 голосов
/ 16 декабря 2011

[UIFont familyName] поддерживается в iPhone OS 2.0 (до версии 2.0 сторонние приложения не были разрешены на iPhone или iPod touch), поэтому я использовал бы это, чтобы проверить, существует ли семейство шрифтов на текущем устройстве, и если он не существует, используйте подходящий резервный шрифт для этой версии iOS. Вот список шрифтов iPhone от оригинального iPhone 2007 года от Джона Грубера (в отличие от шрифтов в Mac OS X того времени). Я не проверил их все, но проверенные мной шрифты iOS все еще в iOS 5:

Вот пример использования [UIFont familyName]:

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

Это выдаст такой список:

Семейства шрифтов: ( Thonburi, "Снелл Раундхэнд", "Academy Engraved 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 для методов класса UIFont familyNames и fontNamesForFamilyName: .

39 голосов
/ 26 ноября 2014

Если вы используете Swift, вы можете распечатать все шрифты (см. Ниже). Вы также можете проверить, существует ли шрифт.

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

    for name in UIFont.fontNames(forFamilyName: family) {
        print("   \(name)")
    }
}
14 голосов
/ 16 декабря 2011

Этот шрифт не был доступен в 4.1, но поддерживается в 4.3. Как лучше всего проверить наличие шрифта

Просто запросите шрифт обычным способом, используя UIFont* f = [UIFont fontWithName:... size:...];. Если шрифт недоступен, результат (f) будет равен нулю.

(Один из способов гарантировать доступность шрифта - включить его в комплект приложения ...)

5 голосов
/ 16 марта 2017

Swift 3.x

Забудьте о циклах for, это самый простой способ увидеть шрифты, поддерживаемые 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"
  ...
2 голосов
/ 19 ноября 2015

Swift версия:

UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print("     \($0)") }) })
2 голосов
/ 12 сентября 2015

Для 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

Надеюсь, это поможет!

2 голосов
/ 24 августа 2015

Это то, что я сделал для цели c, чтобы узнать, доступен шрифт или нет

NSFont *font = [NSFont fontWithName:@"thefont" size:25.0];
if (font==nil) {
    // thefont is available
} else {
    // thefont is not available
}
1 голос
/ 19 марта 2019

Swift 4.x

UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print("     \($0)") }) })
1 голос
/ 04 августа 2015

Попробуйте выполнить инициализацию с этим именем шрифта, и, если оно nil, сделайте что-нибудь еще.Код Swift:

if let font = UIFont(name: name, size: size) { // ok } else { // not ok }

1 голос
/ 10 ноября 2014

Вот преобразование ответа Стивса в код 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)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...