Могу ли я встроить пользовательский шрифт в приложение для iPhone?

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

11.12.2008 20:21:11
В одной из лекций CS193p (iPhone Application Development) в Стэнфорде Эван отметил, что установка собственного шрифта на устройстве - это «большая работа», что, по крайней мере, означает, что это возможно :-)
Ilya Birman 24.04.2009 11:17:44
iPhone 3.2 позволяет использовать собственный шрифт, но это только iPad (см. ответ ниже)
samvermette 11.04.2010 07:06:53
Я использовал изображения в конце.
Airsource Ltd 29.04.2010 15:50:54
вау ... после всего этого, ответ по-прежнему изображения ... невероятно. Я действительно надеялся на надежную реализацию пользовательских шрифтов с теми же возможностями, что и системные шрифты. увы ...
d2burke 17.09.2012 19:22:13
Я существенно урезал первоначальный вопрос, чтобы отразить десятилетие, прошедшее с тех пор, как я его задал. Я бы посоветовал всем урезать свои комментарии и ответы соответствующим образом.
Airsource Ltd 10.06.2019 13:56:33
30 ОТВЕТОВ
РЕШЕНИЕ

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.

645
15.03.2014 12:56:46
Вот пошаговое руководство для iOS4: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
pm_labs 20.09.2010 13:34:20
Этот урок очень хорош. shang-liang.com/blog/custom-fonts-in-ios4 Важно, что аргумент NSString для [UIFont fontWithName: ...] - это имя ОС для шрифта, а не имя файла.
Willster 28.01.2011 18:14:10
Прежде чем кто-либо потратит 3 часа на установку fontforge, чтобы найти фактическое имя постскрипта шрифта, требуемого iOS. Я укажу, что вы можете просто нажать Cmd + I на шрифте в книге шрифтов, чтобы найти эту информацию.
Daniel Wood 20.03.2012 16:51:06
После попыток получить правильное имя шрифта, я просто перечислил установленные шрифты и нашел его. Очень полезно. Вот код: для (NSString * familyName в [UIFont familyNames]) {NSLog (@ "Family% @", familyName); NSLog (@ "Names =% @", [UIFont fontNamesForFamilyName: familyName]); }
Steve Potter 29.03.2012 20:05:21
Если ваш код не работает, убедитесь, что вы нашли файл шрифта в «Фазы сборки» -> «Копировать наборы ресурсов»
Mickey 20.12.2012 09:55:07

Да, вы можете включить пользовательские шрифты. Обратитесь к документации по UIFont, в частности, к fontWithName:size:методу.

1) Убедитесь, что вы включили шрифт в папку ресурсов.

2) «Имя» шрифта не обязательно является именем файла.

3) Убедитесь, что у вас есть законное право использовать этот шрифт. Включая его в свое приложение, вы также распространяете его, и вам нужно иметь на это право.

20
12.12.2008 01:18:13
Вы действительно сделали это успешно? Я не могу заставить это работать, и поиск в Google находит только других людей, которые попробовали это и потерпели неудачу.
Airsource Ltd 12.12.2008 02:12:34
Да. Я имею. Опять же, убедитесь, что вы используете правильное имя шрифта.
August 12.12.2008 04:15:19
Когда вы говорите «имя» шрифта не обязательно является именем файла »... как найти правильное имя?
Keith Fitzgerald 19.02.2009 15:27:21
Да, этот ответ неверный. Вы не можете сделать это из коробки.
Jonathan Sterling 11.04.2010 05:03:20
Обновление iOS 9, документы UIFont ничего не упоминают о пользовательских шрифтах
Cbas 6.06.2016 02:30:34

Я сделал это так:

Загрузите шрифт:

- (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) в шрифте, но это работает.

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

27
7.03.2009 21:34:27
Я уверен, что это работает хорошо, но я (на самом деле) не хочу писать свой собственный механизм компоновки, который будет обрабатывать все, что UILabel и UITextView в настоящее время делают для меня - особенно перенос слов, позиционирование и редактирование.
Airsource Ltd 16.12.2008 03:55:47
AFAICS, это работает только с заглавными буквами, поэтому вызывается 'uppercaseString'.
Martin Cote 8.12.2009 21:47:30
Я подавляю голос, поскольку трюк с «магическим числом» - это чистый взлом, который на самом деле не работает. Реальное решение - получить таблицу cmap из файла TTF.
Martin Cote 9.12.2009 13:28:07
Это полезная информация об использовании шрифтов непосредственно с Core Graphics. Просто для обновления для будущих читателей: в более новых ОС можно и нужно использовать Core Text. В качестве альтернативы можно использовать CGContextShowTextAtPoint()- хотя это не работает с UTF-8.
Ivan Vučica 24.08.2012 13:34:49

Уважать ATSApplicationFontsPath

Простая запись plist, которая позволяет вам включать файлы шрифтов в папку ресурсов вашего приложения, и они «просто работают» в вашем приложении.

5
9.04.2009 11:59:46
Вы пробовали это на устройстве? Я не испытывал радости, и поиск в Google позволяет предположить, что эта запись не поддерживается на iPhone, хотя она задокументирована для iPhone OS.
Airsource Ltd 9.04.2009 13:53:59
Извините, на данный момент я использую его только в приложении OS X.
Matt Sephton 9.04.2009 15:48:42

Это еще не вышло, но следующая версия cocos2d (2d каркас игры) будет поддерживать растровые шрифты переменной длины в виде карт персонажей.

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

У автора нет точной даты выпуска этой версии, но я видел публикацию, в которой указывалось, что это будет в следующем месяце или двух.

8
27.04.2009 22:56:36

Изменить: Начиная с iOS 3.2, эта функциональность встроена. Если вам требуется поддержка до 3.2, вы все равно можете использовать это решение.

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

Важные файлы FontLabel.hи FontLabel.m.

Он использует часть кода из ответа Genericrich .

Просмотрите источник здесь.

ИЛИ

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

  • Добавьте ключ к вашему Info.plistфайлу с именем UIAppFonts. («Шрифты, предоставленные приложением)

  • Сделать этот ключ массивом

  • Для каждого имеющегося шрифта введите полное имя файла шрифта (включая расширение) в качестве элементов массива UIAppFonts.

  • Сохранить Info.plist

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

За дополнительной информацией

299
22.02.2018 16:48:09
Я пытался использовать ваш код, но он часто зависает в зависимости от шрифта. Например, попробуйте использовать африканские или тики шрифты здесь fontspace.com/category/tiki .
4thSpace 14.06.2009 19:06:31
Эта библиотека прекрасно работает. Мне нужна помощь с вертикальным интервалом, хотя. Не могу понять, как это сделать. Итак, у меня есть это message.numberOfLines = 3; Как я контролирую вертикальный интервал между линией 1 и линией 2 и линией 3? Спасибо, Tee
teepusink 15.11.2009 09:09:45
@commanda Здравствуйте, commanda, ссылка, которую вы указали в ответе, кажется, недоступна.
Parth Bhatt 28.01.2013 06:36:23
@ParthBhatt Вы должны использовать решение, предоставленное в stackoverflow.com/a/2616101/21447 вместо FontLabel, поскольку эта функция теперь предоставляется CocoaTouch.
commanda 28.01.2013 22:52:21
@ParthBhatt: я не знаю, почему репо больше не размещается на Zynga, но доступно на github.com/kballard/fontlabel
Lily Ballard 10.05.2013 21:40:49

редактировать: этот ответ больше не существует с 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;
}
36
18.01.2011 00:32:16
Обратите внимание на тех, кто интересуется, это работает, но вам нужно вызвать loadFonts прямо перед использованием шрифта - кажется, они не загружаются во всем приложении
pixel 14.07.2009 17:31:05
В OS 3.0 вам обязательно нужно использовать второй второй пример, не забудьте импортировать. Работал довольно хорошо для меня.
M. Ryan 12.11.2009 19:30:20
Еще одно замечание - это частная структура, и она динамически загружается ... и то, и другое, скорее всего, остановит прием вашего приложения в AppStore.
pixel 1.12.2009 22:05:17
Какой вывод? Какие альтернативы этому методу?
Raj Pawan Gumdal 14.04.2010 12:36:14
Следует также отметить, что [NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];возвращает 0 ширины и высоты для любых пользовательских шрифтов, которые я пробовал.
Luke Mcneice 17.01.2011 09:01:22

Может быть, автор забыл дать шрифту имя Mac FOND ?

  1. Откройте шрифт в FontForge, затем перейдите в Элемент> Информация о шрифте
  2. Существует опция «Mac», в которой вы можете установить имя FOND.
  3. Под File> Export Font вы можете создать новый ttf

Вы также можете попробовать опцию «Apple» в диалоговом окне экспорта.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Я не разработчик IPhone!

6
1.05.2009 01:19:38

Я пробовал различные предложения на этой странице на iOS 3.1.2, и вот мои выводы:

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

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

6
8.08.2013 13:11:11

В iOS 4 есть простой способ использовать пользовательские шрифты .

  1. Добавьте ваш файл шрифта (например, Chalkduster.ttf) в папку ресурсов проекта в XCode.
  2. Откройте info.plistи добавьте новый ключ с именем UIAppFonts. Тип этого ключа должен быть массивом.
  3. Добавьте свое имя шрифта в этот массив, включая extension ( 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
116
23.05.2017 12:03:02
Кажется, это поддерживается до версии 3.2, а не только до 4.0+
Jesse Rusak 19.10.2010 22:25:43
Спасибо! Проблема, с которой я столкнулся, заключается в том, что пользовательские шрифты, кажется, немного искажены (дополнительное пространство ниже) по сравнению со встроенными аналогами. Я пытался использовать репозиторий FontLabel от GitHub, который помогает иногда, но не всегда.
Joe D'Andrea 1.08.2011 14:58:57
Стоит отметить, что строка, которую вы передаете конструктору UIFont, НЕ является именем файла, за исключением расширения внутреннего имени шрифта. У меня были проблемы с загрузкой шрифта с именем файла, которое я сократил. Когда я использовал полное имя шрифта, содержащееся в файле, шрифт загружался нормально.
slayton 22.08.2011 03:57:21
То, что Слейтон только что сказал, имеет решающее значение. [UIFont fontWithName: ожидает «полное имя» шрифта, которое можно увидеть, открыв его в Font Book и выбрав: Preview -> Show Font Info
electromaggot 20.11.2011 08:16:39

Найдите TTF в поиске и «Получить информацию». Под заголовком «Полное имя:» он дал мне имя, которое я затем использовал fontWithName(я просто скопировал и вставил точное имя, в этом случае расширение '.ttf' не было необходимости).

10
7.12.2010 01:16:18

Одно важное замечание: вы должны использовать «имя PostScript», связанное со шрифтом, а не его полное имя или фамилию. Это имя часто может отличаться от обычного имени шрифта.

8
15.01.2011 16:40:06

Лучшее решение - добавить новое свойство " Fonts provided by application" в ваш info.plistфайл.

Затем вы можете использовать свой собственный шрифт, как обычно UIFont.

5
8.08.2013 13:11:49

Вот пошаговая инструкция, как это сделать. Нет необходимости в дополнительной библиотеке или специальном кодировании.

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

В большинстве случаев проблема связана со шрифтом, а не с методом. Лучший способ сделать это - использовать шрифт, который наверняка будет работать, например, verdana или geogia. Затем измените на нужный шрифт. Если это не работает, возможно, имя шрифта неправильное, или шрифт не является хорошо отформатированным шрифтом.

12
19.08.2011 11:28:38

Для 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, добавьте имя файла в его plist и запустите его на устройстве, для которого вы создаете, он отправит вам полный список шрифтов, используя ожидаемые имена UIFont fontWithName:.

5
14.06.2013 10:45:01

Если вы используете xcode 4.3, вы должны добавить fontк Build PhaseUnder 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.
20
23.05.2017 11:47:18

Очень легко добавить новый шрифт в ваше существующее приложение для iOS.

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

Откройте ваше приложение info.plist. Добавьте новую строку как «Шрифты, предоставляемые приложением» и введите имя шрифта как font.ttf.

А при настройке шрифта делай как setFont:"corresponding Font Name"

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

Он возвращает все шрифты, поддерживаемые вашим приложением.

12
8.08.2013 13:12:55

Я совмещал некоторые советы на этой странице с тем, что работает для меня в iOS 5.

Во-первых, вы должны добавить собственный шрифт в ваш проект. Затем вам нужно следовать совету @iPhoneDev и добавить шрифт в ваш файл info.plist.

После того, как вы это сделаете, это работает:

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

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

Затем наслаждайтесь вашим собственным шрифтом.

5
3.09.2012 16:13:27

Сначала добавьте шрифт в формате .odt к вашим ресурсам, в этом случае мы будем использовать DINEngschriftStd.otf, затем используйте этот код, чтобы назначить шрифт метке

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

Чтобы убедиться, что ваш шрифт загружен в проект, просто позвоните

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

В .plist вы должны объявить шрифт. Просто добавьте запись «Шрифты, предоставляемые приложением» и добавьте строку элемента 0 с именем шрифта (DINEngschriftStd.otf).

5
26.09.2012 09:58:53

В 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]];
51
16.01.2013 18:21:15

Вы можете добавить необходимые файлы «FONT» в папку ресурсов. Затем перейдите в Info.plistфайл проекта и используйте КЛЮЧ «Шрифты, предоставленные приложением» и укажите значение «ИМЯ ШРИФТА».

Тогда вы можете вызвать метод [UIFont fontwithName:@"FONT NAME" size:12];

2
8.08.2013 13:13:38

Я сделал все возможное, но новые шрифты не появляются, поэтому я нашел решение:

Когда вы перетаскиваете файлы fot (otf или ttf), НЕ забудьте установить флажок «Добавить к целям».

После этого ваш шрифт появится, и все будет работать нормально.

1
28.01.2013 15:34:35

следуйте за этим шагом

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

Выполнено!! Если ваш шрифт все еще не работает, сначала проверьте его совместимость

6
22.02.2018 16:28:29
почему не открывается info.plist?
Raptor 12.08.2013 07:58:52
почему пробел между Myraid & Pro в 5-й точке, когда в Plist нет точки в 4-й точке?
jayant rawat 24.04.2020 05:25:22

Существует новый способ использования пользовательских шрифтов, начиная с iOS 4.1. Он позволяет загружать шрифты динамически, будь то файлы из приложения, загруженные данные или что-то еще. Он также позволяет загружать шрифты по мере необходимости, тогда как старый метод загружает их все во время запуска приложения, что может занять слишком много времени, если у вас много шрифтов.

Новый метод описан в ios-dynamic-font-loading

Вы используете 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);
3
14.06.2013 10:58:39
Я использовал этот код, но получил & error Не удалось загрузить шрифт: Операция не может быть завершена. (com.apple.coretext error 105 - Не удалось зарегистрировать CGFont '<CGFont (0x14fe7df0): Shruti>')
Hiren 10.04.2013 12:38:56
Согласно документации, ошибка 105 kCTFontManagerErrorAlreadyRegisteredгласит: «Файл уже зарегистрирован в указанной области». developer.apple.com/library/ios/#documentation/Carbon/Reference/…
David M. 21.04.2013 20:05:27

Хотя некоторые из приведенных выше ответов верны, я написал подробное наглядное пособие для людей, у которых все еще есть проблемы со шрифтами.

Решения выше, которые говорят вам, чтобы добавить шрифт к списку и использовать

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

правильные. Пожалуйста, используйте любой другой хакерский способ. Если вы все еще сталкиваетесь с проблемами при поиске имен шрифтов и их добавлении, вот учебник -

Использование пользовательских шрифтов в приложении ios

1
14.06.2013 10:58:32
Я только что попробовал это. Кажется, работает, но мой шрифт крошечный, независимо от того, какой размер я его установил. Для чего он стоит, я использую свободно доступный файл OTF: philsfonts.com/index.php/free_fonts
ari gold 9.06.2013 02:07:07
Попробуйте с любым другим нестандартным шрифтом, и если проблема не исчезнет, ​​дайте мне знать. Если это работает так, значит, есть проблема с вашим шрифтом.
Bharat Gulati 26.06.2013 18:54:26

В качестве улучшения ответа @ bdev приведена обновленная версия для перечисления только пользовательских шрифтов.

Шаг 1: Узнайте все системные шрифты, используя ответ @ bdev, и сохраните в файл.

Поместите следующий код в первый View Controller -(void)viewDidLoad, после [super viewDidLoad](или в делегат приложения):

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSMutableArray *system_fonts = [NSMutableArray array];
for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
        [system_fonts addObject:fontName];
    }
}
if([paths count] > 0) {
    [system_fonts writeToFile:[[paths objectAtIndex:0]
                               stringByAppendingPathComponent:@"array.out"] atomically:YES];
}

Запустите приложение один раз. Останови это потом.

Шаг 2: Добавить собственный шрифт в проект

Используя метод, показанный в принятом ответе, добавьте свои пользовательские шрифты (не забудьте обновить .plistи добавить файлы шрифтов для сборки, проверив Add To Target.

Шаг 3: Сравните системные шрифты с текущим списком шрифтов

Замените коды на шаге 1 на:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSMutableArray *system_fonts = [NSMutableArray arrayWithContentsOfFile:[[paths objectAtIndex:0]
                                                                        stringByAppendingPathComponent:@"array.out"]];

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

Запустите приложение, и список добавленных вами пользовательских шрифтов будет показан.

Это относится к iOS 3.2 до iOS 6 (будущие выпуски, вероятно, работают нормально). Работает с .ttcи .ttfтак же.

0
23.05.2017 11:47:18

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

пошагово следуя туда:

  • Добавьте ваши файлы шрифтов в ваш проект в поддержку файлов
  • Добавьте ключ к вашему 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] я надеюсь, вы получите правильный ответ

1
22.02.2018 18:15:03

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

пошагово следуя туда:

Добавьте ваши файлы шрифтов в ваш проект в поддержку файлов

Добавьте ключ в файл Info.plist с именем UIAppFonts.

Сделать этот ключ массивом

Для каждого имеющегося шрифта введите полное имя файла шрифта (включая расширение) в качестве элементов массива UIAppFonts.

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

я надеюсь, что вы получите правильный ответ

1
26.03.2014 07:00:11

С 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)")
       }

   }

}

РЕДАКТИРОВАТЬ

Я хочу упомянуть, что вам нужно добавить файлы шрифтов к фазам сборки вашей Target , Copy Bundle Resources . Без этого вы не увидите свой шрифт на устройстве. И это может привести к неожиданному поведению.

Например, я сталкиваюсь bug, когда у UITextFieldменя есть собственный шрифт, но его нет в ресурсах Copy Bundle . И когда я перехожу к viewcontrollerэтому textfield, происходит задержка около 4 секунд до вызова viewDidLoadфункции. Устранение проблем со шрифтами устранило эту задержку. Итак, рекомендуем проверить это дважды. (rdar: // 20028250) Кстати, я не смог воспроизвести ошибку, но я уверен, что проблема была со шрифтом.

34
23.02.2018 13:55:58
Просто записка. Пользовательские шрифты не доступны в LaunchScreens, даже если они правильно настроены в IB. Что может быть логикой.
Rivera 16.04.2015 14:29:41
@ Ривера вау, отличная заметка! Не знал этого. Думаю, возможной альтернативой является использование UIImage с текстом.
Dima Deplov 17.04.2015 18:48:51
@Rivera, спасибо за эту информацию - она ​​где-нибудь задокументирована? Я неоднократно шел по ступенькам, думая, что пропустил шаг.
spongessuck 4.01.2016 19:29:15
@spongessuck не уверен в вашем вопросе, но есть несколько документов developer.apple.com/library/ios/documentation/StringsTextFonts/…
Dima Deplov 5.01.2016 10:53:45

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

Шаг 1 - Перетащите ваш .ttf или .otf из Finder в ваш проект

ПРИМЕЧАНИЕ. - Обязательно установите флажок «Добавить к целям» в основной цели приложения.

Перетащите файлы шрифтов в свой проект и нажмите, чтобы добавить их к цели

Если вы забыли нажать , чтобы добавить его к цели , то нажмите на файл шрифта в иерархии проекта и на правой боковой панели щелкните главную цель приложения в Target Membership разделе

как добавить шрифты к цели приложения, если вы забыли

Чтобы убедиться, что ваши шрифты являются частью цели вашего приложения, убедитесь, что они отображаются в ваших ресурсах Copy Bundle в фазах сборки

как проверить ресурсы, чтобы увидеть, являются ли шрифты частью цели приложения

Шаг 2 - Добавьте имена файлов шрифтов в свой Plist

Перейдите к пользовательским целевым свойствам iOS в разделе « Информация» и добавьте ключ к элементам в этом разделе с именем Fonts provided by application(вы должны увидеть, что он появляется в качестве опции при вводе, и он будет настроен как массив. Нажмите маленькую стрелку чтобы открыть элементы массива и ввести имена файлов .ttf или .otf, которые вы добавили, чтобы ваше приложение знало, что это те файлы шрифтов, которые вам нужны

ПРИМЕЧАНИЕ. - Если ваше приложение вылетает сразу после этого шага, проверьте правильность написания добавленных здесь элементов.

пример plist с добавлением пользовательских шрифтов

Шаг 3 - Узнайте названия ваших шрифтов, чтобы вы могли называть их

Довольно часто имя шрифта, видимое вашим приложением, отличается от того, что вы думаете, оно основано на имени файла для этого шрифта, вставьте это в свой код и просмотрите журнал, который ваше приложение делает, чтобы увидеть, какое имя шрифта вызывать в вашем коде.

стриж

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

Цель С

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)

Цель С

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
11
29.09.2015 16:53:57