Как получить имя шрифта из файла 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)})})
}