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

83

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

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

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

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

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

Dude_Willie.otf
Impact
handsean.ttf

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

я пытался

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

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

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

Fogmeister
источник
возможный дубликат имени несистемного шрифта в iPhone
borrrden
@FyodorVolchyok ах. Посмотрите комментарии. Я уже проигнорировал этот вопрос. Проблема, с которой я столкнулся, заключалась в том, что я не установил шрифты должным образом в проекте, поэтому в списке familyNamesфактически не отображались шрифты, которые я искал.
Fogmeister 01
unix.stackexchange.com/q/26053/26227 - fc-scan --format "%{foundry}: %{family}\n" filename.ttfили filename.otf.
Дэйв Джарвис

Ответы:

88

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

  • Добавьте your_new_font.ttf или your_new_font.otf в свой проект Xcode
  • В вашем проекте info.plist добавьте новую запись your_new_font.ttf или your_new_font.otf в UIAppFontsмассив (простой текст для этого - «Шрифты, предоставленные приложением»)
  • На этом этапе я рекомендую добавить этот временный фрагмент отладочного кода, чтобы выгрузить все шрифты, доступные для вашего приложения, включая недавно добавленный your_new_font:

// Swift

    for family: String in UIFont.familyNames {
        print("\(family)")
        for names: String in UIFont.fontNames(forFamilyName: family) {
            print("== \(names)")
        }
    }

// Objective-c

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

Щелкните правой кнопкой мыши 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)")
    }
}
Сегев
источник
Это действительно зависит от создателя шрифта. У нас было несколько ужасных шрифтов, которые мы получили от клиента, и названия шрифтов серьезно произвольны, когда они используются iOS. Я просто попробовал этот метод с одним из наших шрифтов, и он потерпел неудачу.
borrrden
@borrrden до сих пор у меня этот метод работал каждый раз. Я никогда не создавал шрифт сам, так что, возможно, вы правы, я не знаю.
Сегев
Скорее всего, это подойдет для хорошо сделанных шрифтов. Полученные шрифты были созданы около двух десятков лет назад (было плохо ...). Однако единственный способ убедиться в этом - это спросить систему.
borrrden
3
Спасибо, это сработало после того, как я правильно установил шрифты в файле info.plist.
Fogmeister
6
Это работает не для всех шрифтов. Например, значение «Полное имя» отображается как «Proxima Nova Regular», когда семейство в коде - «ProximaNova-Regular»
rrbrambley
59
  • Установите шрифт
  • Откройте приложение Font Book на вашем Mac
  • Выберите шрифт и нажмите кнопку «Информация».
  • Имя, которое вы ищете, - имя PostScript.
    • MacOS: Просмотр -> Показать информацию о шрифте.

пример

Элин Герсин
источник
5
кажется, самый простой способ
Эяль Альшейх 02
8
fwiw, мне нужно было зайти в View> Show Font Info, чтобы увидеть детали. Не знаю, почему на моей машине он был отключен по умолчанию.
Марк Робсон
41

Чтобы использовать шрифты в iOS, вы должны загрузить шрифт на основе ПОЛНОГО ИМЯ шрифта (имени PostScript), которое иногда (и обычно отличается) от фактического ИМЯ ФАЙЛА шрифта .

Представьте, что вы переименовываете файл шрифтов «Arial-regular.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 будут напечатаны автоматически, тогда вы сэкономите время в рабочем процессе разработки и получите этот удобный сценарий, готовый к использованию, когда он вам понадобится.

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

радиовизуальный
источник
Я использую Mac. Я загрузил fontConfig по предоставленной вами ссылке. Но в нем так много файлов. Как мне использовать его или установить fontConfig на свой Mac.
Суджай ООН
@SujayUN Если вы работаете на Mac, возможно, у вас уже установлена fc-scanутилита. Что происходит при запуске fc-scan -Vна терминале?
radiovisual
3
Вы можете также установить FontConfig через доморощенный : brew install fontconfig.
radiovisual
Я понял это, когда запустил ur cmd -bash: fc-scan: command not found
Суджай ООН
Хорошо, я рекомендую вам установить через Homebrew, если он не установлен на вашем компьютере. См. Ссылку на Homebrew и команду установки в моем комментарии выше.
radiovisual
6

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

  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]);
        }
  }

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

Арпит Кульшреста
источник
6

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

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предметами.

Роберт
источник
5

Swift 3.0

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

источник
5

Решение Swift 4.0+

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

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

Выведет:

семейство: Apple SD Gothic Neo

шрифт: AppleSDGothicNeo-Thin

шрифт: AppleSDGothicNeo-Light

Джаред
источник
4

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

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}
Оливер Пирмэйн
источник
4

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

Мориц
источник
3

Swift 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }
Гарри Нг
источник
2

Еще один «быстрый, практичный» прием, который не включает сканирование всех шрифтов по умолчанию, существующих в эмуляторе или устройстве, - это использовать шрифт для чего-то в вашем storyboard. Затем, если вы редактируете раскадровку с помощью текстового редактора (открытого как source code), вы можете увидеть шрифты, используемые с «внутренними» именами, если вы выполните поиск по тегу «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>
Каолин огонь
источник
1

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

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

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

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

Нишант Тяги
источник
Похоже, у нас это не работает - Если имя файла отличается от имени семейства шрифтов, это не сработает
Blitz
Вы должны получить название шрифта в получении информации.
Nishant Tyagi
0

Список названий и семейств шрифтов для macOS с Swift 4.1 :

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }
Бен Шталь
источник
-2

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)})})
}
НиравС
источник
Прочтите вопрос.
Fogmeister
@Fogmeister Ваш принятый ответ такой же, поэтому я пишу этот код короче ..
NiravS
Эта строка читает файл ttf или otf, а затем дает семейство шрифтов и все названия шрифтов .. @Fogmeister
NiravS
Если принятый ответ такой же, как и ваш ... зачем вы пишете этот? Просто отредактируйте тот, который уже существует (для этого предназначена кнопка редактирования). Не пытайтесь украсть очки репутации других людей, скопировав их ответы на незначительные изменения. Теперь я изменил принятый вопрос на более свежий, который показывает, как правильно установить шрифты. Спасибо
Fogmeister
Кроме того, ваш ответ - «всего одна строка кода», но он практически не читается. Я бы предпочел ответ, состоящий из нескольких строк, которые можно легко просмотреть, чтобы увидеть, что он делает.
Fogmeister