Чи можу я вставити користувацький шрифт у програму iPhone?


772

Я хотів би, щоб програма включала в себе спеціальний шрифт для візуалізації тексту, завантажувала його, а потім використовувала його зі стандартними UIKitелементами, такими як UILabel. Чи можливо це?


5
На одній з лекцій CS193p (iPhone Application Development) у Стенфорді Еван зазначив, що встановлення власного шрифту на пристрої - це "велика робота", що, принаймні, означає, що це можливо :-)
Ілля Бірман,

2
iPhone 3.2 дозволяє використовувати власні шрифти, але це лише iPad (див. відповідь нижче)
samvermette

6
Зрештою, я використав зображення.
Airsource Ltd

2
ух ... зрештою, відповідь все-таки образи ... неймовірні. Я дуже сподівався на надійну реалізацію користувацьких шрифтів з тією ж можливістю, що і системні шрифти. на жаль ...
d2burke

1
Я істотно обробив оригінальне питання, щоб відобразити десятиліття, що минуло з моменту його запитання. Я б закликав усіх інших достойно обробляти свої коментарі та відповіді.
Airsource Ltd

Відповіді:


646

iOS 3.2 та пізніші версії цього підтримують. Прямо з нового в iPhone OS 3.2 doc:


Програми підтримки користувальницьких шрифтів, які хочуть використовувати спеціальні шрифти, тепер можуть включати ці шрифти у свій пакет програм та реєструвати ці шрифти в системі, включивши ключ UIAppFonts у свій файл Info.plist. Значення цього ключа - це масив рядків, що ідентифікують файли шрифтів у пакеті програми. Коли система бачить ключ, він завантажує вказані шрифти та робить їх доступними для програми.

Після того, як шрифти встановлені в Info.plist, ви можете використовувати власні шрифти як будь-який інший шрифт у IB або програмно.

На Форумах розробників Apple триває нитка:
https://devforums.apple.com/thread/37824 (необхідний вхід)

Ось чудовий і простий підручник з 3 кроків про те, як цього досягти (розірване посилання видалено)

  1. Додайте власні файли шрифтів у свій проект, використовуючи Xcode як ресурс
  2. Додайте ключ до Info.plistфайлу, який називається UIAppFonts.
  3. Зробіть цей ключ масивом
  4. Для кожного наявного шрифту введіть повне ім'я файлу шрифту (включаючи розширення) як елементи до UIAppFontsмасиву
  5. Зберегти Info.plist
  6. Тепер у вашій програмі ви можете просто зателефонувати, [UIFont fontWithName:@"CustomFontName" size:12]щоб отримати спеціальний шрифт для використання у своїх UILabels та UITextViews тощо.

Також: Переконайтеся, що шрифти містяться у ваших ресурсах Copy Bundle.


14
Ось покроковий посібник для iOS4: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
pm_labs

15
Цей підручник дуже хороший. shang-liang.com/blog/custom-fonts-in-ios4 Важливо, що аргумент NSString для [UIFont fontWithName: ...] - це ім'я ОС для шрифту, а не ім'я файлу.
Уілстер

152
Перш ніж хтось витрачає 3 години на встановлення fontforge, щоб знайти фактичну назву шрифту, необхідного для iOS. Я зазначу, що ви можете просто натиснути Cmd + I на шрифт у книзі шрифтів, щоб знайти цю інформацію.
Даніель Вуд

42
Після всіх зусиль, щоб отримати правильну назву шрифту, я просто перерахував встановлені шрифти і знайшов його. Дуже корисний. Ось код: для (NSString * familyName у [UIFont familyNames]) {NSLog (@ "Family% @", familyName); NSLog (@ "Names =% @", [UIFont fontNamesForFamilyName: familyName]); }
Стів Поттер

26
Якщо ваш код не працює, переконайтеся, що ви знайшли файл шрифту у розділі "Фази збірки" -> "Копіювати пакет реконструкцій"
Міккі

299

Редагувати: Станом на iOS 3.2, ця функціональність вбудована. Якщо вам потрібно підтримати попередній 3.2, ви все одно можете використовувати це рішення.

Я створив простий модуль, який розширює UILabelта обробляє завантаження файлів .ttf. Я випустив його з відкритим кодом під ліцензією Apache і поставив його на github Here.

Важливими файлами є FontLabel.hі FontLabel.m.

Він використовує частину коду з відповіді Genericrich .

Тут перегляньте джерело .

АБО

  • Скопіюйте файл шрифту в ресурси

  • Додайте ключ до свого Info.plistфайлу під назвою UIAppFonts. ("Шрифти, надані додатком)

  • Зробіть цей ключ масивом

  • Для кожного наявного шрифту введіть повне ім'я файлу шрифту (включаючи розширення) як елементи до масиву UIAppFonts

  • Зберегти Info.plist

  • Тепер у вашій програмі ви можете просто зателефонувати, [UIFont fontWithName:@"CustomFontName" size:15]щоб отримати спеціальний шрифт, який можна використовувати разом із вашим UILabelsі UITextViewsт. Д.…

Для отримання додаткової інформації


2
Я намагався використовувати ваш код, але він виходить з ладу досить часто, залежно від шрифту. Наприклад, спробуйте використати шрифти африканських чи тикіських звідси fontspace.com/category/tiki .
4thSpace

2
Ця бібліотека чудово працює. Мені потрібна допомога з вертикальним проміжком, хоча. Не можу зрозуміти, як це зробити. Отже, у мене є це повідомлення.numberOfLines = 3; Як я можу контролювати вертикальний проміжок між рядком 1 та лінією 2 та лінією 3? Дякую,
Трійко

2
@commanda Привіт команда, посилання, яке ви вказали у своїй відповіді, здається недоступним.
Parth Bhatt

5
@ParthBhatt Ви повинні використовувати рішення , запропоноване в stackoverflow.com/a/2616101/21447 замість FontLabel, так як ця функція тепер забезпечується CocoaTouch.
команда

2
@ParthBhatt: Я не знаю, чому РЕПО більше не влаштовується на zynga, але воно доступне на сайті github.com/kballard/fontlabel
Лілі Баллард

116

Існує простий спосіб використання користувацьких шрифтів в iOS 4 .

  1. Додайте файл шрифту (наприклад, Chalkduster.ttf) у папку " Ресурси " проекту в XCode.
  2. Відкрийте info.plistі додайте новий ключ, який називається UIAppFonts. Тип цього ключа повинен бути масивом.
  3. Додайте до цього масиву власне ім'я шрифту, включаючи розширення ( Chalkduster.ttf).
  4. Тепер ви можете використовувати [UIFont fontWithName:@"Chalkduster" size:16]у своїй програмі.

На жаль, IB не дозволяє ініціалізувати мітки зі спеціальними шрифтами. Дивіться це питання, щоб вирішити цю проблему. Моє улюблене рішення - використовувати спеціальний UILabelпідклас:

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end

3
Здається, це підтримується до 3.2, а не лише 4.0+
Джессі Русак

1
Дякую! Проблема, яка у мене виникає, полягає в тому, що спеціальні шрифти, здається, перекошують трохи високо (додаткове місце внизу) порівняно зі своїми вбудованими аналогами. Я намагався використовувати репо FontLabel від GitHub, яка допомагає деякий час, але не весь час.
Джо Д'Андреа

12
Варто зазначити, що рядок, який ви передаєте конструктору UIFont, НЕ є ім'ям файлу за вирахуванням розширення, внутрішнього імені шрифту. У мене виникли проблеми із завантаженням шрифту з назвою файлу, який я скоротив. Коли я використовував ціле ім'я шрифту, як міститься у файлі, шрифт завантажується прекрасно.
слайтон

5
Що саме сказав Слейтон, є критичним. [UIFont fontWithName: очікує "повне ім'я" шрифту, яке видно, відкривши його в книзі шрифтів і вибравши: Попередній перегляд -> Показати інформацію про шрифт
electromaggot

51

У Info.plist додайте запис "Шрифти, надані програмою" та додайте назви шрифтів у вигляді рядків:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

Потім перевірте, чи не включено ваш шрифт, запустивши:

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

Зауважте, що ваше ім'я файлу ttf може бути не тим самим іменем, яке ви використовуєте під час встановлення шрифту для вашої мітки (ви можете скористатися кодом вище, щоб отримати параметр "fontWithName"):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];

36

редагувати: Ця відповідь не використовується на iOS3.2; використовувати UIAppFonts

Єдиний спосіб, коли мені вдалося успішно завантажити користувальницьку систему UIFont, - це через приватну структуру GraphicsServices.

Далі буде завантажено всі .ttfшрифти в основний пакет програми:

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

Після завантаження шрифтів їх можна використовувати так само, як і шрифти, надані Apple:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices можна навіть завантажувати під час виконання, якщо API зникне в майбутньому:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

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

В ОС 3.0 вам обов'язково потрібно використовувати другий другий приклад, не забувайте про імпорт. Для мене працювали досить добре.
М. Райан

Ще одна примітка - це приватний фреймворк, який динамічно завантажує його ... і те, і інше, швидше за все, зупинить прийняття вашої програми в AppStore.
піксель

Який висновок? Які альтернативи цьому методу?
Raj Pawan Gumdal

1
Слід також зазначити, що [NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];для будь-яких спеціальних шрифтів повертається 0 ширини та висоти.
Люк Макнейс

34

За допомогою iOS 8+ і Xcode 6+ ви можете це легко зробити. Ось такі кроки:

1) Перетягніть шрифт у Xcodeпапку Підтримуючі файли. Не забудьте позначити додаток у розділі Додати до цілей . З цього моменту ви можете використовувати цей шрифт IBі вибирати його з палітри шрифту.

введіть тут опис зображення

2) Щоб зробити цей шрифт доступним у вашому пристрої, відкрийте свій info.plistі додайте Fonts provided by applicationключ. Він буде містити ключ Item 0, ви повинні додати ім'я шрифту як значення. Назва шрифту може відрізнятися від імені вашого шрифту. Але спочатку спробуйте додати своє ім’я файлу у більшості випадків це робота.

введіть тут опис зображення

Якщо ні, то ця стаття мені завжди допомагала.

Ось швидкий фрагмент коду з цієї статті, який допоможе вам знайти ім’я шрифту.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

EDIT

Хочу зазначити, що вам потрібно додати файли шрифтів у фази збирання цілі , скопіювати ресурси ресурсу . Без цього ви не побачите свій шрифт на пристрої. І це може призвести до несподіваної поведінки.

Наприклад, я стикаюся з a bug, коли UITextFieldмають спеціальний шрифт, але цей шрифт не був у ресурсах Copy Bundle Copy . І коли я переймаюся viewcontrollerцим textfield, виникає затримка приблизно на 4 секунди до того, як viewDidLoadбула викликана функція. Вирішення проблем із шрифтом усунуло цю затримку. Тож рекомендуємо перевірити це двічі. (rdar: // 20028250) Btw, я не зміг відтворити помилку, але впевнений, що проблема була з шрифтом.


1
Просто записка. Спеціальні шрифти недоступні в LaunchScreens, навіть якщо вони правильно налаштовані в IB. Що може бути логікою.
Rivera

@Rivera ух, чудова примітка! Не знав цього. Можлива альтернатива - використовувати натомість UIImage з текстом, я думаю.
Діма Деплов

@ Rivera, спасибі за цю інформацію - це документально десь задокументовано? Я не раз переходив по сходах, думаючи, що пропустив крок.
губка смокч

@spongessuck не впевнений у своєму питанні, але є деякі документи developer.apple.com/library/ios/documentation/StringsTextFonts/…
Діма Деплов

27

Я зробив це так:

Завантажте шрифт:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

Тепер у вашому drawRect:зробіть щось подібне:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

По суті, вам потрібно виконати певну грубу силу, що прокручує текст і хитається з магічним числом, щоб знайти ваше зміщення (тут, див. Мені, використовуючи 29) у шрифті, але це працює.

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


1
Я впевнений, що це працює добре, але я (справді насправді) не хочу писати свій власний механізм компонування, щоб обробляти все, що UILabel і UITextView зараз роблять для мене - особливо обгортання слів, позиціонування та редагування.
Airsource Ltd

1
AFAICS, це працює лише з великими літерами, отже, виклик 'верхнього регістру'.
Мартін Кот

2
Я виступаю проти, оскільки трюк "магічного числа" - це чистий хак, який насправді не працює. Справжнє рішення - отримати таблицю cmap з файлу TTF.
Мартін Кот

1
Це акуратний фрагмент інформації про використання шрифтів безпосередньо з Core Graphics. Просто для оновлення для майбутніх читачів: У нових ОС, можна і потрібно використовувати Core Text. Можна також скористатися, CGContextShowTextAtPoint()хоча це не працює з UTF-8.
Іван Вучиця

20

Так, ви можете включити спеціальні шрифти. Зверніться до документації про UIFont, зокрема, про fontWithName:size:метод.

1) Переконайтеся, що ви включили шрифт у свою папку ресурсів.

2) "Ім'я" шрифту не обов'язково має назву файлу.

3) Переконайтеся, що у вас є законне право на використання цього шрифту. Включивши його у свій додаток, ви також поширюєте його, і вам потрібно мати право на це.


Ви справді зробили це успішно? Я не можу змусити його працювати, і Google шукає лише інших людей, які спробували це і не змогли.
Airsource Ltd

Так. Я маю. Знову ж таки, переконайтеся, що ви використовуєте належну назву шрифту.
Август

1
Коли ви говорите "Ім'я" шрифту - це не обов'язково ім'я файлу "... як знайти правильну назву?
Кіт Фіцджеральд

7
Так, ця відповідь неправильна. Ви не можете зробити це поза коробкою.
Джонатан Стерлінг

Оновлення iOS 9, документи UIFont нічого не згадують про власні шрифти
Cbas

20

Якщо ви користуєтесь xcode 4.3, вам потрібно додати значення font" Build Phaseнижче" Copy Bundle Resources, відповідно до https://stackoverflow.com/users/1292829/arne у потоці, Спеціальні шрифти Xcode 4.3 . Це працювало для мене. Ось такі кроки, які я вжила для роботи з користувацькими шрифтами в моєму додатку:

  1. Додайте шрифт до свого проекту. Я перетягнув і перекинув OTF(або TTF) файли на нову групу, яку створив і прийняв на вибір xcode copying the files over to the project folder.
  2. Створіть UIAppFontsмасив зі своїми шрифтами, переліченими як елементи в масиві. Просто names, а не розширення (наприклад, " GothamBold", " GothamBold-Italic").
  3. Клацніть по project nameшляху вгорі Project Navigatorна лівій частині екрана.
  4. Перейдіть на Build Phasesвкладку, що з’являється в основній області xcode.
  5. Розгорніть розділ " Copy Bundle Resources" і натисніть, "+"щоб додати шрифт.
  6. Виберіть файл шрифту з файлового навігатора, який відкриється при натисканні на "+".
  7. Зробіть це для кожного шрифту, який вам належить add to the project.

12

Ось покрокова інструкція, як це зробити. Не потрібна додаткова бібліотека чи якесь спеціальне кодування.

http://shang-liang.com/blog/custom-fonts-in-ios4/

Більшість випадків питання стосується шрифту, а не методу. Найкращий спосіб зробити це - використовувати шрифт, який напевно спрацює, як-от вердана або геогія. Потім перейдіть до призначеного шрифту. Якщо це не працює, можливо, назва шрифту невірна, або шрифт - це не добре сформований шрифт.


12

Додайте новий шрифт у свій додаток iOS дуже просто.

Вам просто потрібно додати шрифт, наприклад font.ttf, у свою папку ресурсів.

Відкрийте свою заявку info.plist. Додайте новий рядок як "Шрифти, надані програмою" та введіть назву шрифту як font.ttf.

І при встановленні шрифту робіть так setFont:"corresponding Font Name"

Ви можете перевірити, додано ваш шрифт чи ні NSArray *check = [UIFont familyNames];.

Він повертає весь шрифт, який підтримує ваша програма.


11

Я рекомендую дотримуватися одного з моїх улюблених коротких навчальних посібників тут: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/, з якого надходить ця інформація.

Крок 1 - Перетягніть .ttf або .otf з Finder у свій проект

ПРИМІТКА. Переконайтесь, що натисніть поле "Додати до цілей" у вашій головній цілі програми

Перетягніть файли шрифтів у свій проект та натисніть, щоб додати їх до своєї цілі

Якщо ви забули натиснути , щоб додати його до мети , то натисніть на файл шрифту в ієрархії проекту і на правій бічній панелі клацніть головну мету програми в Target Membership розділі

як додати шрифти до цілі програми, якщо ви забули

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

як перевірити ресурси, щоб побачити, чи не є шрифти частиною цілі програми

Крок 2 - Додайте імена файлів шрифтів у свій список

Перейдіть до спеціальних властивостей цілі iOS у розділі Інформація та додайте ключ до елементів у цьому розділі під назвою Fonts provided by application(ви повинні побачити, що він з'являється як опція під час його введення, і він налаштує себе як масив. Клацніть маленьку стрілку щоб відкрити елементи масиву та ввести імена файлів .ttf або .otf, які ви додали, щоб повідомити вашій програмі про те, що це файли шрифтів, які ви хочете отримати

ПРИМІТКА. Якщо ваш додаток виходить з ладу відразу після цього кроку, перевірте написання елементів, які ви додали сюди

Наприклад, список із доданими спеціальними шрифтами

Крок 3 - Дізнайтеся назви ваших шрифтів, щоб ви могли їх зателефонувати

Досить часто назва шрифту, що бачиться у вашій програмі, відрізняється від того, що, на вашу думку, засноване на імені файлу цього шрифту, введіть це у свій код і перегляньте журнал, який ваша програма робить, щоб побачити, яке ім'я шрифту викликати у вашому коді

Швидкий

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

Мета C

for (NSString* family in [UIFont familyNames]){
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family]){
        NSLog(@"  %@", name);
    }
}

Ваш журнал повинен виглядати приблизно так:

Приклад журналу пошуку для пошуку назв шрифту

Крок 4 - Використовуйте новий спеціальний шрифт, використовуючи ім’я з кроку 3

Швидкий

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)

Мета C

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];

10

Знайдіть TTF у пошуку та "Отримайте інформацію". Під заголовком "Повне ім'я:" він дав мені ім'я, з яким я тоді використовувався fontWithName(я просто скопіював і вставив точне ім'я, в цьому випадку ніякого розширення ".ttf" не потрібно).


8

Це ще не вийшло, але наступна версія cocos2d (2d ігровий фреймворк) підтримуватиме шрифти бітових карт різної довжини як карти символів.

http://code.google.com/p/cocos2d-iphone/isissue/detail?id=317

У автора немає прибитої дати випуску для цієї версії, але я побачив публікацію, яка вказувала, що це буде через наступний місяць-два.


8

Одне важливе зауваження: Ви повинні використовувати "PostScript ім'я", пов'язане з шрифтом, а не його повне ім'я або прізвище. Ця назва часто може відрізнятися від звичайної назви шрифту.


7

виконайте цей крок

1) Скопіюйте свій шрифт у своєму проекті

2) відкрити .plistфайл у режимі вихідного коду ... (Примітка - Не відкриватиinfo.plist )

3) Перед цим - клацніть правою кнопкою миші на своєму шрифті та відкрийте його у fontforge чи подібному редакторі та install його у вашій системі.install

4) Введіть це

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5) Введіть цей код у своєму class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

Тут lblPoints буде змінено як у вашому UILabel

Готово !! Якщо ваш шрифт все ще не працює, спочатку перевірте сумісність шрифтів


1
чому б не відкрити info.plist?
Раптор

чому проміжок між Myraid & Pro у 5-й точці, коли в Plist у точці 4 його немає?
jayant rawat

@jayantrawat Її ім'я шрифту, яке відображається в системі після встановлення шрифту, а .plist - це ім'я файлу шрифту [.ttl або otf]
Kirtikumar A.

@KirtikumarA. так, це вдало втілено в додатку ..
jayant rawat

@jayantrawat, якщо моє рішення допоможе, тоді я прошу вас дати відповідь на відповідь, щоб інші користувачі могли взяти допомогу так само
Kirtikumar A.

6

Можливо, автор забув надати шрифту ім'я Mac FOND ?

  1. Відкрийте шрифт у FontForge після чого перейдіть до елемента> Інформація про шрифт
  2. Є опція "Mac", де можна встановити ім'я FOND.
  3. У розділі Файл> Експорт шрифту ви можете створити новий ttf

Ви також можете спробувати опцію "Apple" у діалоговому вікні експорту.

ВІДМОВА : Я не розробник IPhone!


6

Я випробовував різні пропозиції на цій сторінці в iOS 3.1.2, і ось мої висновки:

Просто за допомогою [UIFont fontWithName:size:] шрифтів у каталозі ресурсів не буде працювати, навіть якщо ім'я FOND встановлено за допомогою FontForge.

[UIFont fontWithName:size:]буде працювати, якщо шрифти завантажуються спочатку за допомогою GSFontAddFromFile. Але GSFontAddFromFileвін не є частиною iOS 3.1.2, тому його потрібно динамічно завантажувати, як описано в @rpetrich.


5

Подивіться ATSApplicationFontsPath

Простий запис у списку, який дозволяє включати файли шрифтів у папку ресурсів програми, і вони "просто працюють" у вашому додатку.


Ви пробували це на пристрої? У мене не було ніякої радості, і googling припускає, що ця запис у списку не підтримується на iPhone, навіть якщо це документально підтверджено для ОС iPhone.
Airsource Ltd

1
На жаль, на даний момент я його використовую лише в додатку OS X.
Метт Сефтон

5

Деякі поради на цій сторінці я поєднав у щось, що працює для мене на iOS 5.

По-перше, ви повинні додати спеціальний шрифт до свого проекту. Потім вам потрібно дотримуватися порад @iPhoneDev і додати шрифт у файл info.plist.

Після цього це працює:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

Однак вам потрібно знати назву Postcript вашого шрифту. Просто дотримуйтесь порад @Daniel Wood та натисніть команду-i, поки ви знаходитесь у FontBook.

Потім насолоджуйтесь своїм власним шрифтом.


5

Спочатку додайте шрифт у форматі .odt до ваших ресурсів; в цьому випадку ми будемо використовувати DINEngschriftStd.otf, а потім використовуємо цей код для присвоєння шрифту ярлику

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

Щоб переконатися, що ваш шрифт завантажений у проект, просто зателефонуйте

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

У списку .plist ви повинні оголосити шрифт. Просто додайте запис "Шрифти, надані програмою", і додайте рядок 0 із назвою шрифту (DINEngschriftStd.otf)


5

Для iOS 3.2 та новіших версій: використовуйте наведені вище декілька методів, які є:

  1. Додайте файл шрифту (наприклад, Chalkduster.ttf ) у папку "Ресурси" проекту в XCode.
  2. Відкрийте info.plist і додайте новий ключ під назвою UIAppFonts. Тип цього ключа повинен бути масивом.
  3. Додайте до цього масиву власне ім'я шрифту, включаючи розширення (" Chalkduster.ttf ").
  4. Використовуйте [UIFont fontWithName:@"Real Font Name" size:16]у своїй програмі.

АЛЕ "Справжнє ім'я шрифту" - це не завжди те, що ви бачите у Fontbook. Найкращий спосіб запитати у свого пристрою, які шрифти він бачить та які точні назви.

Я використовую uifont-name-grabber, розміщений за адресою: uifont-name-grabber

Просто введіть потрібні шрифти в проект xcode, додайте ім'я файлу до його списку та запустіть його на пристрої, для якого ви будуєте, він надішле вам електронний лист із повним списком шрифтів, використовуючи очікувані імена UIFont fontWithName:.


5

Краще рішення - додати нову властивість " Fonts provided by application" у ваш info.plistфайл.

Потім ви можете використовувати власний шрифт як звичайний UIFont.


3

Існує новий спосіб використання спеціальних шрифтів, починаючи з iOS 4.1. Це дозволяє динамічно завантажувати шрифти, будь то файли, що входять до програми, завантажені дані чи що у вас є. Він також дозволяє завантажувати шрифти у міру необхідності, тоді як старий метод завантажує їх усі під час запуску програми, що може зайняти занадто багато часу, якщо у вас багато шрифтів.

Новий метод описаний при завантаженні шрифтів ios-dynamic

Ви використовуєте CTFontManagerRegisterGraphicsFontфункцію, надаючи їй буфер із вашими даними про шрифт. Потім він доступний для UIFontперегляду в Інтернеті, як і колишній метод. Ось зразок коду за цим посиланням:

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

Я використав цей код, але отримав & помилку Не вдалося завантажити шрифт: Операцію не вдалося завершити. (com.apple.coretext помилка 105 - Не вдалося зареєструвати CGFont '<CGFont (0x14fe7df0): Shruti>')
Hiren

Згідно з документацією, помилка 105 - kCTFontManagerErrorAlreadyRegistered"Файл уже зареєстрований у визначеному обсязі". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
Девід М.

3

Швидкий, кодовий спосіб: (працює також зі швидким 2.0)

Додайте потрібні шрифти до свого проекту (як і додавання зображень, просто перетягніть на Xcode), переконайтесь, що вони націлені на ваш проект,
додайте цей метод та завантажте власні шрифти (рекомендується в appDelegate didFinishLaunchingWithOptions)

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Приклад використання:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Використовуйте шрифт:

UIFont(name: "My-Font", size: 16.5)

Цікаво, що, чому ви не просто додасте шрифт у свій Info.plist, схоже, набагато більше роботи для того ж самого.
Стівен Джессі

2

Ви можете додати необхідні файли "FONT" у папку ресурсів. Потім перейдіть до Info.plistфайлу проекту та використовуйте КЛЮЧОВУ "Шрифти, надані програмою" та значення "FONT NAME".

Тоді ви можете викликати метод [UIFont fontwithName:@"FONT NAME" size:12];


1

Я зробив все можливе, але нові шрифти не з’являються, тому я знайшов рішення:

Коли ви перетягуєте файли fot (otf або ttf) DONT, не забудьте встановити прапорець у полі "Додати до цілей".

Після цього ваш шрифт з’явиться, і все буде добре.


1

Хоча деякі відповіді вище є правильними, я написав докладний наочний посібник для людей, які все ще мають проблеми з шрифтами.

Розв’язання, над якими вказано, можна додати шрифт до списку та використовувати

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

є правильними. Будь ласка, використовуйте будь-який інший хакерський спосіб. Якщо у вас все ще виникають проблеми з пошуком імен шрифту та додаванням їх, ось підручник -

Використання спеціальних шрифтів у додатку ios


Я просто спробував це. Здається, працює, але мій шрифт крихітний, незалежно від того, якого розміру я його встановив. Для чого це варто, я використовую вільно доступний файл OTF: philsfonts.com/index.php/free_fonts
золото

Спробуйте це з будь-яким іншим спеціальним шрифтом, і якщо проблема не зникає, повідомте мене. Якщо це працює таким чином, то виникає проблема з вашим шрифтом.
Бхарат Гулаті

1

так, ви можете використовувати спеціальний шрифт у вашій програмі

Крок за кроком слідуючи там:

Додайте власні файли шрифтів у свій проект у підтримуючі файли

Додайте ключ до файлу Info.plist під назвою UIAppFonts.

Зробіть цей ключ масивом

Для кожного наявного шрифту введіть повне ім'я файлу шрифту (включаючи розширення) як елементи до масиву UIAppFonts

Збережіть Info.plist Тепер у вашій програмі ви можете просто зателефонувати [UIFont fontWithName: @ "Ваше власне ім'я шрифту" розмір: 20], щоб отримати спеціальний шрифт, який слід використовувати з вашими UILabels після застосування цього, якщо ваш неправильний шрифт не виходить, то двічі клацніть на спеціальному шрифті, і уважно перегляньте назву шрифту верхньої сторони та скопіюйте цей шрифт, вставте сюди [UIFont fontWithName: @ "тут минуло власне ім'я шрифту" розмір: 20]

Я сподіваюся, що ви отримаєте правильну відповідь


1

так, ви можете використовувати спеціальний шрифт у вашій програмі

Крок за кроком слідуючи там:

  • Додайте власні файли шрифтів у свій проект у підтримуючі файли
  • Додайте ключ до свого Info.plistфайлу під назвою UIAppFonts.
  • Зробіть цей ключ масивом
  • Для кожного наявного шрифту введіть повне ім'я файлу шрифту (включаючи розширення) як елементи до масиву UIAppFonts
  • Збережіть Info.plist зараз у вашій програмі ви можете просто зателефонувати, [UIFont fontWithName:@"your Custom font Name" size:20]щоб отримати спеціальний шрифт, який можна використовувати з вашимUILabels

після цього застосуйте, якщо ваш неправильний шрифт не виходить, то ви двічі клацніть на спеціальний шрифт, і уважно побачите назву шрифту верхньої сторони та скопіюйте цей шрифт, вставте, тут [UIFont fontWithName:@" here past your Custom font Name" size:20] я сподіваюся, що ви отримаєте правильну відповідь

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