Як отримати назву шрифту з файлу 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.

Як я можу знайти, яке ім'я використовувати?


Що поганого в підході, перерахованому в першому запитанні?
borrrden


"Що не так із першим дублікатом запитання?" це мені нічого не говорить. Я надрукував [UIFont familyNames], і жоден з них не стосується моїх шрифтів.
Фогмайстер

1
Тоді ваш шрифт встановлено неправильно
borrrden

Гах! Я не додав їх до списку info.plist ...
Фогмайстер

Відповіді:


85

Виконайте ці чотири простих кроки, щоб додати та використовувати новий шрифт у своєму додатку iOS:

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

// Стрімкий

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

// Завдання-с

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]і ви повинні бути в бізнесі!

2
Дякую, ти врятував мій день
Yahya Alshaar

123

Клацніть правою кнопкою миші на TTF -> Отримати інформацію

"Повне ім’я" - це те, що ви шукаєте.

Це те, що мені вдалося з TTF.

Редагувати:

Я щойно використав шрифт, який мав іншу назву, ніж "Повне ім’я" в "Отримати інформацію".

Для компіляції цієї відповіді, якщо швидка перевірка вище не працює, запустіть цей код у своєму проекті:

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, поки що цей метод працював у мене щоразу. Я ніколи не створював шрифт сам, тому ти можеш мати рацію, я не знаю.
Сегєв

Швидше за все, це буде працювати для добре зроблених шрифтів. Шрифти, які ми отримали, були створені приблизно 2 десятиліття тому (це було погано ...). Однак єдиний спосіб бути впевненим - це запитати систему.
borrrden

3
Дякую, це спрацювало після того, як я правильно встановив шрифти у файлі info.plist.
Фогмайстер

6
Це працює не для всіх шрифтів. Наприклад, значення "Повне ім’я" відображається як "Proxima Nova Regular", коли сім'я в коді "ProximaNova-Regular"
rrbrambley

58
  • Встановіть шрифт
  • Відкрийте програму Font Book на своєму Mac
  • Виберіть шрифт і натисніть кнопку "інформація"
  • Ви шукаєте ім’я PostScript
    • MacOS: Перегляд -> Показати інформацію про шрифт

приклад


5
здається найпростішим способом
Еяль Альшайх

6
fwiw, мені потрібно було перейти Переглянути> Показати інформацію про шрифт, щоб побачити деталі. Не знаю, чому він вимкнений за замовчуванням на моїй машині.
Марк Робсон,

41

Щоб використовувати шрифти в iOS, вам слід завантажити шрифт на основі ПОВНОВОГО НАЗВАННЯ шрифту (ім’я PostScript), яке іноді (і, як правило, відрізняється) відрізняється від фактичного НАЗВА ФАЙЛУ шрифту .

Уявіть, що ви перейменуєте файл шрифту "Arial-regular.ttf" у "foo.ttf". Шрифт, що міститься у файлі шрифту, який ви щойно перейменували, все ще є "Arial-regular".

Є кілька хороших програмних способів отримати назву шрифту вже в цьому потоці, але я маю інший підхід за допомогою командного рядка.

Якщо ви перебуваєте на 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, ім'я файлу) та деяким кольоровим кодуванням, ви можете запустити цей альтернативний сценарій:

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.
Sujay UN

@SujayUN Якщо ви перебуваєте на Mac, можливо, у вас вже встановлена fc-scanпрограма. Що трапляється, коли ти працюєш fc-scan -Vна терміналі?
радіовізуальний

3
Ви можете також встановити FontConfig через доморощений : brew install fontconfig.
радіовізуальний

Я отримую це, коли запустив ur cmd -bash: fc-scan: команду не знайдено
Sujay UN

Добре, я рекомендую вам встановити за допомогою Homebrew, якщо на вашому комп'ютері він не встановлений. Дивіться посилання на команду Homebrew та install у моєму коментарі вище.
радіовізуальна

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

Свіфт 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);
    }
}

3

Ви також можете використовувати otfinfo --info arial.ttf, щоб отримати ім'я з командного рядка. Ім’я приписки - це те, яке потрібно передати конструктору UIFont.


3

Свіфт 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

Увійдіть до сімейних імен файлу шрифтів, а потім отримайте доступ до шрифтів:

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

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

Сподіваюся, це допоможе вам.


Здається, це не працює для нас - якщо ім’я файлу відрізняється від назви шрифту, це не вдається
бліц

Ви повинні отримати назву шрифту в інформаційному списку.
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 Ваша прийнята відповідь така сама, ось чому я пишу цей код коротше ..
NiravS

Цей рядок читає файл ttf або otf, а потім надає сімейство шрифтів, і це все називається шрифтом .. @Fogmeister
NiravS

Якщо прийнята відповідь така ж, як і ваша ... чому ви пишете цю? Просто відредагуйте ту, яка вже існує (для цього і призначена кнопка редагування). Не намагайтеся викрадати очки представників інших людей, копіюючи їх відповіді на незначні незначні зміни. Зараз я прийняв прийняте запитання на більш недавнє, яке показує, як правильно встановити шрифти. Дякуємо
Фогмайстер

Крім того, ваша відповідь - "лише один рядок коду", але він майже не читається. Я вважаю за краще відповідь із кількома рядками, які можна легко відсканувати, щоб побачити, що він робить.
Фогмайстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.