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

Порядок свойств в нормальных объектах является сложным объектом в Javascript.

Хотя в ES5 явно не указан порядок, ES2015 имеет порядок в определенных случаях. Это следующий объект:

o = Object.create(null, {
  m: {value: function() {}, enumerable: true},
  "2": {value: "2", enumerable: true},
  "b": {value: "b", enumerable: true},
  0: {value: 0, enumerable: true},
  [Symbol()]: {value: "sym", enumerable: true},
  "1": {value: "1", enumerable: true},
  "a": {value: "a", enumerable: true},
});

Это приводит к следующему порядку (в некоторых случаях):

Object {
  0: 0,
  1: "1",
  2: "2",
  b: "b",
  a: "a",
  Symbol(): "sym"
}
  1. целые ключи в порядке возрастания
  2. нормальные клавиши в порядке ввода
  3. Символы в порядке вставки

Таким образом, существует три сегмента, которые могут изменить порядок вставки (как это произошло в пример). И целые ключи не придерживаются порядка вставки.

Вопрос в том, какие методы этот порядок гарантирован в спецификации ES2015?

Следующие методы гарантируют показанный порядок:

  • Object.assign
  • Object.defineProperties
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • ]
  • Reflect.ownKeys

Следующие методы / петли не гарантируют никакого порядка:

  • Object.keys
  • для ..in
  • JSON.parse
  • JSON.stringify

Вывод: даже в ES2015 вы не должны полагаться на порядок свойств нормального объектов в Javascript. Он подвержен ошибкам. Вместо этого используйте Map.

768
задан Airsource Ltd 10 June 2019 в 13:55
поделиться

10 ответов

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

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

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

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

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

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

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

644
ответ дан 22 November 2019 в 21:24
поделиться

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

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

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

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

20
ответ дан August 10 June 2019 в 13:55
поделиться

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

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

- (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]);
}

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

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

27
ответ дан Sophie Alpert 10 June 2019 в 13:55
поделиться

Поиск ATSApplicationFontsPath

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

5
ответ дан 22 November 2019 в 21:24
поделиться

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

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

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

8
ответ дан 22 November 2019 в 21:24
поделиться

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

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

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

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

Просмотрите исходный код Здесь.

ИЛИ

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

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

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

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

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

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

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

299
ответ дан 22 November 2019 в 21:24
поделиться

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

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

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

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

6
ответ дан 22 November 2019 в 21:24
поделиться

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;
}
36
ответ дан 22 November 2019 в 21:24
поделиться

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

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

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

6
ответ дан 22 November 2019 в 21:24
поделиться

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

  1. Добавьте файл вашего шрифта (например, Chalkduster.ttf) в папку Resources проекта в XCode.
  2. Откройте info.plist и добавьте новый ключ под названием UIAppFonts. Тип этого ключа должен быть array.
  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
116
ответ дан 22 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: