Порядок свойств в нормальных объектах является сложным объектом в 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"
}
Таким образом, существует три сегмента, которые могут изменить порядок вставки (как это произошло в пример). И целые ключи не придерживаются порядка вставки.
Вопрос в том, какие методы этот порядок гарантирован в спецификации ES2015?
Следующие методы гарантируют показанный порядок:
Следующие методы / петли не гарантируют никакого порядка:
Вывод: даже в ES2015 вы не должны полагаться на порядок свойств нормального объектов в Javascript. Он подвержен ошибкам. Вместо этого используйте Map
.
iOS 3.2 и более поздние версии поддерживают это. Прямо из Что нового в iPhone OS 3.2 документ:
Поддержка пользовательских шрифтов
Приложения, которые хотят использовать пользовательские шрифты, теперь могут включать эти шрифты в свои пакеты приложений и регистрировать эти шрифты в системе с помощью включая ключ UIAppFonts в свой файл Info.plist. Значение этого ключа представляет собой массив строк, идентифицирующих файлы шрифтов в пакете приложения. Когда система видит ключ, она загружает указанные шрифты и делает их доступными для приложения.
После того, как шрифты были установлены в Info.plist
, вы можете использовать свои собственные шрифты как любой другой шрифт в IB или программно.
На форумах разработчиков Apple есть постоянная ветка:
https://devforums.apple.com/thread/37824 (требуется вход в систему)
А вот отличное и простое трехшаговое руководство о том, как для этого (неработающая ссылка удалена)
Info.plist
с именем UIAppFonts
. UIAppFonts
Информация .plist
[UIFont fontWithName: @ "CustomFontName" size: 12]
, чтобы получить настраиваемый шрифт для использования с вашими UILabels и ] UITextViews и т. Д. Также: убедитесь, что шрифты находятся в ваших ресурсах пакета копирования.
Да, можно включать пользовательские шрифты. Обратитесь к документации относительно UIFont, а именно, fontWithName:size:
метод.
1) Удостоверяются, что Вы включаете шрифт в свою папку ресурсов.
2) "название" шрифта является не обязательно именем файла.
3) Удостоверяются, что у Вас есть законное право использовать тот шрифт. Включением его в Вашем приложении Вы также распределяете его, и необходимо иметь право сделать это.
Я сделал это как это:
Загрузка шрифт:
- (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), в шрифте, но это работает.
кроме того, необходимо удостовериться, что шрифт юридически встраиваем. Большинство не и существуют адвокаты, которые специализируются на этом виде вещи, так быть предупрежденными.
Поиск ATSApplicationFontsPath
Простая запись plist, позволяющая включать файлы шрифтов в папке ресурсов вашего приложения, и они «просто работают» в вашем приложении.
Это еще не вышло, но следующая версия cocos2d (2d каркас игры) будет поддерживать растровые шрифты переменной длины в качестве карт персонажей.
http: // code.google.com/p/cocos2d-iphone/issues/detail?id=317
W автор не имеет назначенной даты выхода этой версии, но я видел сообщение, в котором указано, что это будет в следующем месяце или два.
Редактировать: Начиная с 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
и т. Д.
Может быть, автор забыл дать шрифту имя Mac FOND ?
Вы также можете попробовать опцию «Apple» в диалоговом окне экспорта. .
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Я не разработчик для iPhone!
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;
}
Я пробовал различные предложения на этой странице на iOS 3.1.2, и вот мои выводы:
Просто используя [UIFont fontWithName: size:]
со шрифтами в каталоге ресурсов не будет работать, даже если имя FOND установлено с помощью FontForge.
[UIFont fontWithName: size:]
будет работать, если шрифты загружаются сначала с помощью GSFontAddFromFile. Но GSFontAddFromFile
не является частью iOS 3.1.2, поэтому его необходимо динамически загружать, как описано @rpetrich.
Существует простой способ использовать пользовательские шрифты в iOS 4.
Chalkduster.ttf
) в папку Resources проекта в XCode. info.plist
и добавьте новый ключ под названием UIAppFonts
. Тип этого ключа должен быть array. Chalkduster.ttf
). [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