2011-03-12 73 views
27

我知道您可以使用Interface Builder自定義字體並選擇字體。但是,我很好奇,如果我可以使用系統上默認不包含的自定義字體。有沒有辦法在我的應用程序中包含自定義字體?Cocoa應用程序中的自定義字體

+24

@poke:這是不是一個重複的,這是** **的Mac,如明確列出我的標籤。請仔細閱讀。 – 2011-03-12 16:01:00

+1

哦,我的壞。對不起。 – poke 2011-03-12 16:07:18

+0

@poke:沒關係。 :) – 2011-03-12 16:07:51

回答

46

雖然手動字體激活過程是一種選擇,你也可以考慮ATSApplicationFontsPath的Info.plist鍵:

Information Property List Key Reference

ATSApplicationFontsPathString - 蘋果 OS X)標識 字體文件或 軟件包的Resources目錄中的字體目錄的位置。如果 nt,Mac OS X激活指定路徑的字體 ,供 捆綁應用程序使用。字體爲 ,僅適用於捆綁的 應用程序,而不適用於整個系統爲 。路徑本身應該是 ,其指定爲相關目錄 該資源的資源目錄。對於 例如,如果字體的目錄是 在路徑 /Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/, 應指定字符串 Stuff/MyFonts/這 鍵的值。」

我一定要仔細檢查,但我相信這個功能是在OS X 10.5.x(Jinhyung Park發佈的代碼)中添加的。

+0

是啊,或者你我相信可以使用Snow Leopard中引入的Core Text。 – 2011-03-12 21:16:12

+0

該解決方案是正確的選擇。感謝您指出。 – 2011-09-15 09:45:25

+0

這很容易。謝謝 – drudru 2012-01-06 08:57:25

-6

我設法使用cocos2d(CCLabelBMFont)和hiero工具來做到這一點。您將需要使用hiero創建字體,並將該字體賦予CCLabelBMFont對象。

+3

我的問題是關於** Mac **,而不是iPhone。 – 2011-03-12 16:08:18

3

這裏是Mac應用自定義字體加載的例子。

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

難道你不能只調用'[NSFont fontWithName:@「fontname」]'? – 2011-03-12 16:17:25

+0

我在http://cocoadev.com/index.pl?UsingCustomFontsInYourCocoaApplications上閱讀討論。加載字體後,可以使用[NSFont fontWithName:@「」]。我剛剛檢查了我的Mac OS X應用程序,它正在工作。 – 2011-03-12 16:24:29

+0

有趣的是,在搜索ATSFontActivateFromFileReference時無法在Xcode幫助或ADC中找到任何內容 - 需要轉至硬盤上的「ATS/ATSFont.h」以獲取任何信息。 – Jay 2012-01-13 17:05:34

3

ATSApplicationFontsPath使用[NSBundle mainbundle]路徑作爲基本路徑,所以當資源文件夾不在時它不工作那裏(例如對於應用程序插件)

在我的可可插件,我需要使用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

+0

好的答案,需要這個爲我的屏幕保護程序,plist值不會在那裏工作。 – 2016-08-10 07:40:13

相關問題