Custom font in a Cocoa application

前端 未结 4 1109
渐次进展
渐次进展 2020-12-08 01:23

I know you can customize fonts by using Interface Builder and selecting a font. However, I\'m curious if I can use a custom font that\'s not included by default on systems.

相关标签:
4条回答
  • 2020-12-08 01:39

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-08 01:45

    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).

    0 讨论(0)
  • 2020-12-08 01:50

    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.

    0 讨论(0)
  • 2020-12-08 01:56

    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

    0 讨论(0)
提交回复
热议问题