Могу ли я встроить пользовательский шрифт в приложение для iPhone? - PullRequest
768 голосов
/ 11 декабря 2008

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

Ответы [ 32 ]

638 голосов
/ 11 апреля 2010

iOS 3.2 и более поздние версии поддерживают это. Прямо из Что нового в iPhone OS 3.2 doc:

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

Как только шрифты установлены в Info.plist, вы можете использовать свои пользовательские шрифты как любой другой шрифт в IB или программно.

На форумах Apple для разработчиков существует постоянная тема:
https://devforums.apple.com/thread/37824 (требуется авторизация)

А вот отличное и простое трехшаговое руководство о том, как этого добиться (неработающая ссылка удалена)

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

Также: убедитесь, что шрифты есть в ваших ресурсах Copy Bundle.

297 голосов
/ 01 мая 2009

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

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

Важными файлами являются FontLabel.h и FontLabel.m.

Используется часть кода из Ответ Дженеричрича .

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

OR

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

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

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

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

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

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

Для получения дополнительной информации

115 голосов
/ 08 июля 2010

В iOS 4 .

есть простой способ использовать пользовательские шрифты.
  1. Добавьте файл шрифта (например, Chalkduster.ttf) в папку Resources проекта в 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
51 голосов
/ 17 октября 2012

В 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 голосов
/ 01 мая 2009

edit: этот ответ больше не существует с iOS3.2; использовать UIAppFonts

Единственный способ успешно загрузить пользовательские UIFont s - это через частную платформу 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;
}
34 голосов
/ 02 сентября 2014

С iOS 8 + и Xcode 6 + вы можете сделать это легко. Вот шаги:

1) Перетащите ваш шрифт в папку Xcode Supporting Files. Не забудьте пометить ваше приложение в разделе Добавить к цели . С этого момента вы можете использовать этот шрифт в IB и выбрать его из палитры шрифтов.

enter image description here

2) Чтобы сделать этот шрифт доступным на вашем устройстве, откройте info.plist и добавьте ключ Fonts provided by application. Он будет содержать ключ Item 0, вы должны добавить имя шрифта в качестве значения. Название шрифта может отличаться от вашего имени файла шрифта. Но сначала попробуйте добавить свое имя файла, в большинстве случаев это работает.

enter image description here

Если нет, эта статья всегда мне помогала.

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

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


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

   }

}

EDIT

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

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

27 голосов
/ 16 декабря 2008

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

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

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

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

20 голосов
/ 27 марта 2012

Если вы используете 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.
20 голосов
/ 12 декабря 2008

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

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

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

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

12 голосов
/ 30 марта 2012

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...