Custom font in a Cocoa application

4 Solutions Collect From Internet About “Custom font in a Cocoa application”

While the manual font activation procedure is one option, you might also consider the ATSApplicationFontsPath Info.plist key:

Information Property List Key Reference:

ATSApplicationFontsPath (String – Mac
OS X) identifies the location of a
font file or directory of fonts in the
bundle’s Resources directory. If
present, Mac OS X activates the fonts
at the specified path for use by the
bundled application. The fonts are
activated only for the bundled
application and not for the system as
a whole. The path itself should be
specified as a relative directory of
the bundle’s Resources directory. For
example, if a directory of fonts was
at the path
/Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/,
you should specify the string
Stuff/MyFonts/ for the value of this
key.”

I’d be sure to double-check, but I believe this functionality was added in OS X 10.5.x (which the code posted by Jinhyung Park targets).

Here is the example for Mac App custom font loading.

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;
    }
}

ATSApplicationFontsPath uses [NSBundle mainbundle] path as base path, so it does not work when Resources folder is not located there (e.g. for app plugins).

In my Cocoa plugin I need to load custom fonts using 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);
}

Credits: https://github.com/OneSadCookie/Extendaword/blob/master/Extendaword/main.m

I have managed to do this using cocos2d (CCLabelBMFont) and hiero tool. You will need to create the font using the hiero, and give this font to the CCLabelBMFont object.