Как получить имя шрифта из файла 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.
Как узнать, какое имя использовать?
Ответы
Ответ 1
Выполните следующие четыре простых шага, чтобы добавить и использовать новый шрифт в приложении для 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(@"-------------");
}
- В выходных данных отладки найдите имя вашего нового шрифта 'family' и 'font'. Передайте все, что отображается как "font" имя, соответствующее вашему новому семейству шрифтов (может быть более одного "шрифта", связанного с вашим новым шрифтом "family") в
UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20]
, и вы должны быть в бизнесе!
Ответ 2
Щелкните правой кнопкой мыши на TTF → Получить информацию
"Полное имя" - это то, что вы ищете.
Что сработало для меня с TTF.
Edit:
Я только что использовал шрифт с другим именем из "Полное имя" в 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)")
}
}
Ответ 3
- Установить шрифт
- Откройте приложение Font Book на вашем Mac
- Выберите шрифт и нажмите кнопку "Информация"
- Имя, которое вы ищете, это имя PostScript
-
MacOS: Просмотр → Показать информацию о шрифте
![example]()
Ответ 4
Чтобы использовать шрифты в iOS, необходимо загрузить шрифт на основе шрифта FULL NAME (PostScript Name), который иногда (и обычно) отличается от фактического имени шрифта FILE NAME.
Представьте, что вы переименовываете файл шрифта в Arial-регулярный .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
:
![enter image description here]()
Приведенный выше сценарий будет проходить через все файлы .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
![enter image description here]()
Это немного быстрее, чем копировать-вставлять код внутри вашего файла AppDelegate.m, чтобы печатать имена каждый раз, когда вы хотите добавить новый файл шрифта, который является популярным методом, и это также быстрее, чем открывать шрифт в FontBook для проверить имя PostScript.
ПОЛЕЗНЫЙ СОВЕТ: Если вы используете псевдоним вышеупомянутого скрипта в своем терминале, так что все, что вам нужно сделать, это набрать одну команду, чтобы получить все имена шрифтов PostScript для всех файлов в текущем каталоге (моя функция называется fontnames
поэтому все, что мне нужно сделать, это набрать fontnames
в терминале внутри каталога со шрифтами в нем, и имена PostScript будут напечатаны автоматически, тогда вы сэкономите время в своем рабочем процессе разработки и получите этот удобный скрипт, готовый к использованию, когда вы нужно это.
Надеюсь это поможет!
Ответ 5
Вы хотите знать, как получить имя для этого: -
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
Swift 3.0
for familyName in UIFont.familyNames {
for fontName in UIFont.fontNames(forFamilyName: familyName ) {
print("\(familyName) : \(fontName)")
}
}
Ответ 7
Swift 4. 0+ решение
for fontFamilyName in UIFont.familyNames {
print("family: \(fontFamilyName)\n")
for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
print("font: \(fontName)")
}
}
Будет выводить:
семья: Apple SD Готика Нео
font: AppleSDGothicNeo-Thin
font: AppleSDGothicNeo-Light
Ответ 8
После того, как вы добавили свои шрифты в свой проект/приложение, добавьте этот код (возможно, только в приложение delegate didFinishLaunchingWithOptions), чтобы распечатать все доступные шрифты для вашего приложения. Из списка "В" в этом списке вы сможете определить шрифт, который вам нужен. Не забудьте удалить ненужный код после.
for (NSString *fontFamilyName in [UIFont familyNames]) {
for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
NSLog(@"Family: %@ Font: %@", fontFamilyName, fontName);
}
}
Ответ 9
Если вы хотите программно найти имя шрифта для данного файла шрифта:
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
объекты по мере необходимости.
Ответ 10
Вы также можете использовать otfinfo --info arial.ttf, чтобы получить имя из командной строки. Имя postscript - это тот, который вам нужно передать в конструктор UIFont.
Ответ 11
Swift 1.2:
for familyName in UIFont.familyNames() {
for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
println("\(familyName) : \(fontName)")
}
}
Ответ 12
Записать имя_файла имени файла шрифта и затем получить доступ к шрифтам:
// You can log all font family names suing **fontNamesForFamilyName**
NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);
Надеюсь, это поможет вам.
Ответ 13
Еще один "быстрый, практичный" взлом, который не включает проверку всех шрифтов по умолчанию, существующих на эмуляторе или устройстве, - это использовать шрифт для чего-то в вашем раскадровке. Затем, если вы редактируете раскадровку с помощью текстового редактора, вы можете увидеть шрифты, используемые с "внутренними" именами, если вы ищете тег "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>
Ответ 14
Перечислите имена и семейства шрифтов для macOS с помощью Swift 4.1:
NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }
Ответ 15
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)})})
}