2014-02-14 5 views
7

По причинам, связанным с лицензированием, я должен расшифровать файл шрифта и загрузить его в память, а затем зарегистрировать его вместо чтения непосредственно из URL-адреса. Для этого я должен использовать CTFontManagerRegisterGraphicsFont.CTFontManagerRegisterGraphicsFont не регистрирует фамилию

Проблемная часть возникает, когда я пытаюсь использовать [NSFont fontWithName:@"Open Sans" size:21.0], где он будет принимать только название PostScript шрифта (т.е. («OpenSans» или «OpenSans-Bold» для жирного веса) и не будет работать с фамилией «Open Sans».

Если шрифт регистрируется с помощью ATSApplicationFontsPath в info.plist файле или с помощью CTFontManagerRegisterFontsForURLs я могу использовать фамилию шрифта. Но я не могу сделать это таким образом.

(«Open Sans» используется здесь в качестве примера)

Вот код, который я использую для регистрации f ОНТ.

NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"OpenSans-Regular" ofType:@"ttf" inDirectory:@"Fonts"]; 
NSData *fontData = [NSData dataWithContentsOfFile:fontPath]; 

CGDataProviderRef fontProviderRef = CGDataProviderCreateWithCFData((CFDataRef)fontData); 
CGFontRef fontRef = CGFontCreateWithDataProvider(fontProviderRef); 
CFErrorRef error; 

if (! CTFontManagerRegisterGraphicsFont(fontRef, &error)) { 

    CFStringRef errorDescription = CFErrorCopyDescription(error); 
    NSLog(@"Failed to load font: %@", errorDescription); 
    CFRelease(errorDescription); 
} 

CFRelease(fontRef); 
CFRelease(fontProviderRef); 

Есть ли способ, чтобы сделать имя семейства шрифтов доступны NSFont с CTFontManagerRegisterGraphicsFont?

(с помощью Xcode 5 и ориентации Mac OS X> = 10,8)

+0

Вы пытались использовать дескриптор шрифта для создания шрифта с фамилией? –

+0

@LeoNatan еще не пробовал, сделаю. – Salaryman

+0

Сообщите мне, если он работает, поэтому я могу добавить ответ. –

ответ

5

обновление:

Ok, чтобы убедиться, что фамилия происходит от самого шрифта файла: Я попытался это с купелью У меня есть ... GillSansMTStd-Light. Я изменил фамилию в файле шрифта на «Gill Sans Std Mt Light», и впоследствии я мог использовать [ NSFont fontWithName:@"Gill Sans MT Std Light" size:10.0 ].

FontForge шрифта панель информации:

enter image description here

перед:

enter image description here

после:

enter image description here


Я просмотрел все комбинации API-интерфейсов шрифтов и шрифтов CT/NS, о которых я мог думать. Кажется, нет API для связывания фамилии с шрифтом - я думаю, что эти данные поступают из самого файла шрифта.

Я предполагаю, что в таблице имен шрифтов должно быть семейство шрифтов (Mac) и подсемейство шрифта. (см. https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html)

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

Наконец, я думаю, что есть более простой способ добавить шрифт в CTFontManager. Я изменил ваш код на:

// register the font: 
NSURL * url = [[ NSBundle mainBundle ] URLForResource:@"OpenSans-Regular" withExtension:@"ttf" ] ; 
assert(url) ; 

CFErrorRef error = 0 ; 
bool ok = CTFontManagerRegisterFontsForURL((__bridge CFURLRef)url, kCTFontManagerScopeProcess, &error) ; 
assert(ok && !error) ; 

// make sure it's registered (using PS name): 
CTFontRef f = CTFontCreateWithName(CFSTR("OpenSans-Regular"), 10.0, NULL) ; 
assert(f) ; 
+0

К сожалению, хотя это работает для загрузки с URL-адресов, это не работает для моего конкретного случая (и требования) загрузки шрифтов из памяти с использованием NSData. – Salaryman

+0

oh, основывался на вашем коде, который загружает данные из пути в вашем комплекте. Теперь я вижу, что вам нужно расшифровать файл шрифта. Это должен быть самый дорогой в мире шрифт, требующий шифрования в вашем комплекте. – nielsbot

+0

Обычно это относится к проприетарным шрифтам. Существуют специальные условия для использования с приложениями. – Salaryman

Смежные вопросы