Cocoa应用程序中的自定义字体

时间:2011-03-12 15:54:37

标签: objective-c cocoa macos

我知道您可以使用Interface Builder自定义字体并选择字体。但是,我很好奇我是否可以使用系统上默认不包含的自定义字体。有没有办法在我的应用程序中包含自定义字体?

4 个答案:

答案 0 :(得分:46)

虽然手动字体激活程序是一个选项,但您也可以考虑ATSApplicationFontsPath Info.plist键:

Information Property List Key Reference

  

ATSApplicationFontsPathString - Mac   OS X)识别a的位置   字体文件或字体目录   bundle的Resources目录。如果   目前,Mac OS X激活字体   在指定的路径上供使用   捆绑应用程序。字体是   仅为捆绑激活   应用程序,而不是系统   整个。路径本身应该是   指定为的相对目录   bundle的Resources目录。对于   例如,如果是字体目录   在路上   /Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/,   你应该指定字符串   Stuff/MyFonts/代表这个价值   键“。

我一定会仔细检查一下,但我相信这个功能是在OS X 10.5.x中添加的(Jinhyung Park发布的代码是目标)。

答案 1 :(得分:3)

以下是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;
    }
}

答案 2 :(得分:3)

ATSApplicationFontsPath使用[NSBundle mainbundle]路径作为基本路径,因此当Resources文件夹不在那里时它不起作用(例如,对于app插件)。

在我的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

答案 3 :(得分:-6)

我已经设法使用cocos2d(CCLabelBMFont)和hiero工具完成了这项工作。您需要使用hiero创建字体,并将此字体提供给CCLabelBMFont对象。