2014-02-14 82 views
7

由於與許可有關的原因,我必須解密字體文件並將其加載到內存中,然後註冊它,而不是直接從URL中讀取。爲此,我必須使用CTFontManagerRegisterGraphicsFontCTFontManagerRegisterGraphicsFont沒有註冊姓氏

當我嘗試使用[NSFont fontWithName:@"Open Sans" size:21.0],它只接受字體的PostScript名稱(例如(「OpenSans或OpenSans-Bold用於粗體重量)並且不會使用姓氏」Open Sans「時,出現問題的部分。

如果字體在Info.plist文件使用ATSApplicationFontsPath或使用CTFontManagerRegisterFontsForURLs然後我可以使用的字體的系列名稱。但我不能做這種方式註冊。

(「打開三世」這裏用作例子)

這裏是我用來註冊f ONT。

NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"OpenSans-Regular" ofType:@"ttf" inDirectory:@"Fonts"]; 
NSData *fontData = [NSData dataWithContentsOfFile:fontPath]; 

CGDataProviderRef fontProviderRef = CGDataProviderCreateWithCFData((CFDataRef)fontData); 
CGFontRef fontRef = CGFontCreateWithDataProvider(fontProviderRef); 
CFErrorRef error; 

if (! CTFontManagerRegisterGraphicsFont(fontRef, &error)) { 

    CFStringRef errorDescription = CFErrorCopyDescription(error); 
    NSLog(@"Failed to load font: %@", errorDescription); 
    CFRelease(errorDescription); 
} 

CFRelease(fontRef); 
CFRelease(fontProviderRef); 

有沒有辦法讓字體系列名可用於NSFont CTFontManagerRegisterGraphicsFont

(使用Xcode的5和定位的Mac OS X> = 10.8)

+0

您是否嘗試過使用字體描述符來創建帶有姓氏的字體? –

+0

@LeoNatan還沒有嘗試過,會做。 – Salaryman

+0

讓我知道它是否有效,以便我可以添加答案。 –

回答

5

更新:

好,以驗證姓來自於字體文件本身:我用的字體試過這種我有... GillSansMTStd-Light。我將字體文件中的姓氏改爲「Gill Sans Std Mt Light」,隨後我可以使用[ NSFont fontWithName:@"Gill Sans MT Std Light" size:10.0 ]

fontforge的字體信息面板:

enter image description here

前:

enter image description here

後:

enter image description here


我翻遍了我能想到的所有CT/NS字體和字體管理器API的組合。似乎沒有API將一個姓氏與一種字體相關聯 - 我認爲這些數據來自字體文件本身。

我想在字體名稱表中需要有一個(Mac)字體系列和字體子系列條目。 (參考https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html

我已經使用FontForge編輯過去的字體文件 - 也許這可以幫助你?似乎你可以通過自制軟件安裝它。

最後,我認爲有一種更簡單的方法可以將字體添加到CTFontManager。我將您的代碼更改爲:

// register the font: 
NSURL * url = [[ NSBundle mainBundle ] URLForResource:@"OpenSans-Regular" withExtension:@"ttf" ] ; 
assert(url) ; 

CFErrorRef error = 0 ; 
bool ok = CTFontManagerRegisterFontsForURL((__bridge CFURLRef)url, kCTFontManagerScopeProcess, &error) ; 
assert(ok && !error) ; 

// make sure it's registered (using PS name): 
CTFontRef f = CTFontCreateWithName(CFSTR("OpenSans-Regular"), 10.0, NULL) ; 
assert(f) ; 
+0

不幸的是,雖然這適用於從URL加載,但它不適用於我使用NSData從內存加載字體的特定情況(和要求)。 – Salaryman

+0

哦,它基於你的代碼加載你的包中的路徑數據。我現在看到你需要解密字體文件。這一定是世界上最昂貴的字體,因爲它需要在你的軟件包中進行加密。 – nielsbot

+0

這通常是專有字體的情況。有與應用程序使用的具體條款。 – Salaryman