【问题标题】:Custom font in a Cocoa applicationCocoa 应用程序中的自定义字体
【发布时间】:2014-12-12 20:00:24
【问题描述】:

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

【问题讨论】:

  • @poke:这不是重复的,这是为 Mac 准备的,正如我的标签中明确概述的那样。请仔细阅读。
  • @poke:没关系。 :)
  • 猜猜这可能是更好的副本:stackoverflow.com/questions/2444717/embed-font-in-a-mac-bundle - 虽然现在不能改变我的近距离投票:/
  • @poke:看起来很完美。即使我搜索了它,我也没有看到它。 :) 顺便说一句,我尝试在我的应用程序中嵌入 Calibri 是否合法?
  • 不太可能,是 MS 字体。您应该查看许可协议。

标签: objective-c cocoa macos


【解决方案1】:

虽然手动字体激活过程是一种选择,但您也可以考虑使用ATSApplicationFontsPath Info.plist 键:

Information Property List Key Reference:

"ATSApplicationFontsPath (String - Mac OS X) 标识一个位置 字体文件或字体目录 bundle 的 Resources 目录。如果 目前,Mac OS X 激活字体 在指定的路径供用户使用 捆绑的应用程序。字体是 仅对捆绑激活 应用程序而不是系统作为 整个。路径本身应该是 指定为的相对目录 捆绑包的资源目录。为了 例如,如果字体目录是 在路径 /Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/, 你应该指定字符串 Stuff/MyFonts/ 这个值 键。”

我一定会仔细检查,但我相信此功能是在 OS X 10.5.x 中添加的(Jinhyung Park 发布的代码针对该功能)。

【讨论】:

  • 是的,或者你可以使用在 Snow Leopard 中引入的 Core Text,我相信。
  • 此解决方案是正确的方法。感谢您指出。
  • 这要容易得多。谢谢
  • 不知道为什么我之前没有将此标记为答案,但你去吧。 :)
  • 你能帮我解决同样的问题吗,my question
【解决方案2】:

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

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

【讨论】:

  • 很好的答案,我的屏幕保护程序需要这个,plist 值在那里不起作用。
【解决方案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;
    }
}

【讨论】:

  • 你不能打电话给[NSFont fontWithName:@"fontname"]吗?
  • 我阅读了cocoadev.com/index.pl?UsingCustomFontsInYourCocoaApplications 的讨论。加载字体后,您可以使用 [NSFont fontWithName:@""]。我刚刚再次检查了我的 Mac OS X 应用程序,它正在工作。
  • 有趣的是,在搜索 ATSFontActivateFromFileReference 时,您在 Xcode 帮助或 ADC 中都没有找到任何内容 - 需要转到硬盘上的“ATS/ATSFont.h”以获取任何信息..
  • ATSFontActivateFromFileReference = Undocumented = App Store 拒绝
  • @Tibidabo 晚了几年,但根本没有无证:developer.apple.com/legacy/library/documentation/Carbon/…
【解决方案4】:

我已经设法使用 cocos2d (CCLabelBMFont) 和 hiero 工具来做到这一点。您需要使用 hiero 创建字体,并将此字体提供给 CCLabelBMFont 对象。

【讨论】:

  • 我的问题是关于 Mac,而不是 iPhone。
猜你喜欢
  • 2011-09-13
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多