CTFontManagerRegisterGraphicsFont不会注册姓氏

Sal*_*man 8 macos cocoa objective-c

出于与许可相关的原因,我必须解密字体文件并将其加载到内存中然后注册它而不是直接从URL读取.为此,我必须使用CTFontManagerRegisterGraphicsFont.

有问题的部分出现在我尝试使用[NSFont fontWithName:@"Open Sans" size:21.0]它只接受字体的PostScript名称的地方(即("OpenSans或OpenSans-Bold为大胆的重量")并且不会使用姓氏"Open Sans".

如果ATSApplicationFontsPath在info.plist文件中使用注册字体或使用,CTFontManagerRegisterFontsForURLs那么我可以使用该字体的系列名称.但我不能这样做.

(这里使用"Open Sans"作为示例)

这是我用来注册字体的相关代码.

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);
Run Code Online (Sandbox Code Playgroud)

有没有办法让NSFont可以使用字体系列名称CTFontManagerRegisterGraphicsFont

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

nie*_*bot 5

更新:

好的,要验证姓氏来自字体文件本身:我用我的字体尝试了这个... GillSansMTStd-Light.我将字体文件中的姓氏改为"Gill Sans Std Mt Light",随后我可以使用[ NSFont fontWithName:@"Gill Sans MT Std Light" size:10.0 ].

fontforge字体信息面板:

在此输入图像描述

之前:

在此输入图像描述

后:

在此输入图像描述


我查看了我能想到的所有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 ) ;
Run Code Online (Sandbox Code Playgroud)