Я знаю, что вы можете настраивать шрифты с помощью Interface Builder и выбирать шрифт. Тем не менее, мне любопытно, могу ли я использовать собственный шрифт, который по умолчанию не включен в систему. Есть ли способ включить пользовательский шрифт в мое приложение?
Пользовательский шрифт в приложении Cocoa
Ответ 1
В то время как процедура активации ручного шрифта является одним из вариантов, вы также можете рассмотреть ключ ATSApplicationFontsPath
Info.plist:
Ссылка на справочную информацию по информационным свойствам:
"
ATSApplicationFontsPath
(String
- Mac OS X) определяет местоположение файл шрифта или каталог шрифтов в связывает каталогResources
. Если присутствует, Mac OS X активирует шрифты по указанному пути для использования в комплекте. Шрифты активируется только в комплекте а не для системы как целое. Путь должен быть указанный как относительный каталог каталог ресурсов пакетов. Для Например, если каталог шрифтов был на пути/Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/
вы должны указать строкуStuff/MyFonts/
для значения этого ключ".
Я бы не стал дважды проверять, но я считаю, что эта функциональность была добавлена в OS X 10.5.x(код которого размещен целями Jinhyung Park).
Ответ 2
Вот пример загрузки пользовательских шрифтов Mac App.
NSString *fontFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"/fonts"];
fontsURL = [NSURL fileURLWithPath:fontFilePath];
if(fontsURL != nil)
{
OSStatus status;
FSRef fsRef;
CFURLGetFSRef((CFURLRef)fontsURL, &fsRef);
status = ATSFontActivateFromFileReference(&fsRef, kATSFontContextLocal, kATSFontFormatUnspecified,
NULL, kATSOptionFlagsDefault, NULL);
if (status != noErr)
{
errorMessage = @"Failed to acivate fonts!";
goto error;
}
}
Ответ 3
ATSApplicationFontsPath использует путь [NSBundle mainbundle] в качестве базового пути, поэтому он не работает, когда папка Ресурс не находится там (например, для плагинов приложений).
В моем плагине Cocoa мне нужно загрузить пользовательские шрифты, используя CTFontManagerRegisterFontsForURL
#import <Cocoa/Cocoa.h>
static void FGDActivateFont(NSString *fontName)
{
// Can't make ATSApplicationFontsPath in Info.plist work for plugins (non-standard Resources path)
NSArray *availableFonts = [[NSFontManager sharedFontManager] availableFonts];
if (![availableFonts containsObject:fontName]) {
NSURL *fontURL = [[FGDRapidCart bundle] URLForResource:fontName withExtension:@"ttf" subdirectory:@"Fonts"];
assert(fontURL);
CFErrorRef error = NULL;
if (!CTFontManagerRegisterFontsForURL((__bridge CFURLRef)fontURL, kCTFontManagerScopeProcess, &error))
{
CFShow(error);
}
}
}
int main(int argc, char *argv[])
{
@autoreleasepool
{
FGDActivateFont(@"FontAwesome");
}
return NSApplicationMain(argc, (const char **)argv);
}
Кредиты: https://github.com/OneSadCookie/Extendaword/blob/master/Extendaword/main.m
Ответ 4
Мне удалось это сделать, используя cocos2d (CCLabelBMFont) и инструмент hiero. Вам нужно будет создать шрифт с помощью иерархии и передать этот шрифт в объект CCLabelBMFont.