Как получить имя шрифта из файла otf или ttf?

Я использовал собственный шрифт в моем предыдущем приложении.

Имя файла было "ProximaNova-Regular.otf", и для загрузки шрифта я только что использовал...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

Это сработало отлично.

Теперь в этом новом приложении у меня есть три файла шрифтов...

Dude_Willie.otf
Impact
handsean.ttf

Но я не уверен, как их загрузить.

я пытался

[UIFont fontWithName:<the file name> size:20];

Но это просто возвращается к использованию Helvetica.

Как я могу найти какое имя использовать?

15 ответов

Решение

Выполните следующие четыре простых шага, чтобы добавить и использовать новый шрифт в приложении iOS:

  • Добавьте your_new_font.ttf или your_new_font.otf в ваш проект Xcode
  • В info.plist вашего проекта добавьте новую запись для your_new_font.ttf или your_new_font.otf в UIAppFonts массив (простой текст для этого - "Шрифты, предоставляемые приложением")
  • На этом этапе я рекомендую добавить этот временный фрагмент кода отладки, чтобы сбросить все шрифты, доступные вашему приложению, включая недавно добавленный your_new_font:
for(NSString *fontfamilyname in [UIFont familyNames])
{
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
    {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • В выходных данных отладки найдите имя и фамилию вашего нового шрифта. Передайте все, что отображается как имя "font", соответствующее вашему новому семейству шрифтов (может быть более одного "font", связанного с вашим новым шрифтом "family") UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20] и ты должен быть в бизнесе!

Щелкните правой кнопкой мыши на TTF -> Получить информацию

"Полное имя" - это то, что вы ищете.

Вот что у меня с TTF сработало.

Редактировать:

Я просто использовал шрифт, имя которого отличалось от "Полное имя" в Get Info.

Для компиляции этого ответа, если приведенная выше быстрая проверка не работает, запустите этот код в своем проекте:

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

И найдите правильное название шрифта, который вы хотите использовать.

Код Swift 3.0:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}
  • Установить шрифт
  • Откройте приложение Font Book на вашем Mac
  • Выберите шрифт и нажмите кнопку "Информация"
  • Имя, которое вы ищете, это имя PostScript

пример

Чтобы использовать шрифты в iOS, вы должны загрузить шрифт на основе полного имени шрифта (PostScript Name), которое иногда (и обычно) отличается от фактического имени файла шрифта.

Представьте, что вы переименовываете файл шрифта в Arial-normal.ttf в foo.ttf. Шрифт, содержащийся в файле шрифта, который вы только что переименовали, по-прежнему "Arial-обычный".

Есть несколько хороших программных способов получить имя шрифта уже в этом потоке, но у меня другой подход с использованием командной строки.

Если вы работаете на Mac или Linux, просто запустите этот скрипт из командной строки в каталоге, где у вас есть пользовательские шрифты (использует fc-scan утилита от fontconfig, которая, вероятно, уже установлена, но если нет, вы можете установить ее с помощью homebrew: brew install fontconfig):

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

Вот скриншот вышеуказанной команды, запущенной на моем ~/Library/Fonts каталог:

Сценарий выше будет проходить через все .ttf а также .otf файлы в текущем каталоге, затем распечатайте имя PostScript для каждого шрифта, который можно использовать для ссылки на файл шрифта в XCode или в другом месте.

Если вы хотите получить дополнительную информацию (PostScriptName, Filename) и цветовое кодирование, вы можете запустить этот альтернативный скрипт:

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

Это немного быстрее, чем копировать-вставлять код внутри вашего файла AppDelegate.m, чтобы распечатывать имена каждый раз, когда вы хотите добавить новый файл шрифта, который является популярным методом, и это также быстрее, чем открывать шрифт в FontBook для осмотрите имя PostScript.

ПОЛЕЗНЫЙ СОВЕТ: Если вы используете псевдоним вышеупомянутого скрипта в своем терминале, так что все, что вам нужно сделать, это набрать одну команду, чтобы получить все имена шрифтов PostScript для всех файлов в текущем каталоге (моя функция называется fontnames так что все, что мне нужно сделать, это набрать fontnames в терминале внутри каталога со шрифтами в нем, и имена PostScript будут напечатаны автоматически, тогда вы сэкономите время в своем рабочем процессе разработки и получите этот удобный скрипт, готовый к использованию, когда вам это нужно.

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

Если вы хотите найти имя шрифта для данного файла шрифта программно:

import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

Заменить на свой собственный бросаемый Error объекты по мере необходимости.

РешениеSwift 4.0+

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

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

Будет выводить:

Семейство: Apple SD Готика Нео

шрифт: AppleSDGothicNeo-Thin

шрифт: AppleSDGothicNeo-Light

Вы хотите знать, как получить имя пойти на это:-

  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

надеюсь, это поможет вам...

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }

Вы также можете использовать otfinfo --info arial.ttf, чтобы получить имя из командной строки. Имя postscript - это то, что вам нужно передать конструктору UIFont.

После того, как вы добавили свои шрифты в свой проект / приложение, добавьте этот код (возможно, только в методе делегата didFinishLaunchingWithOptions), чтобы распечатать все доступные шрифты для вашего приложения. Из этого списка вы сможете определить шрифт, который вам нужен. Не забудьте удалить ненужный код после.

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

Другой "быстрый, практичный" взлом, который не включает в себя сканирование всех шрифтов по умолчанию, существующих на эмуляторе или устройстве, заключается в использовании шрифта для чего-либо в вашей раскадровке. Затем, если вы отредактируете раскадровку с помощью текстового редактора, вы можете увидеть шрифты, используемые с "внутренними" именами, если вы выполните поиск по тегу "customFonts":

<customFonts key="customFonts">
    <array key="Linotype - AvenirNextLTPro-Bold.otf">
        <string>AvenirNextLTPro-Bold</string>
    </array>
    <array key="Linotype - AvenirNextLTPro-Regular.otf">
        <string>AvenirNextLTPro-Regular</string>
    </array>
    <array key="TradeGothicLTPro-BdCn20.otf">
        <string>TradeGothicLTPro-BdCn20</string>
    </array>
</customFonts>

Swift 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }

Зарегистрируйте familyNames файла шрифта и затем получите доступ к шрифтам:

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

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

Перечислите имена шрифтов и семейства для macOS с Swift 4.1:

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }

Swift 4.0 поддерживается

Это только одна строка кода для печати всего семейства шрифтов и названий шрифтов

override func viewDidLoad() {
    super.viewDidLoad()
    //Main line of code
    UIFont.familyNames.sorted().forEach({ print($0); UIFont.fontNames(forFamilyName: $0 as String).forEach({print($0)})})
}
Другие вопросы по тегам