【发布时间】:2014-01-27 13:45:12
【问题描述】:
我正在使用-[NSFontDescriptor matchingFontDescriptorsWithMandatoryKeys:] 方法来查找系统中是否已经安装了字体,但我得到了非常奇怪的结果。
这是一个测试给定字体是否与安装的字体匹配的小程序:
#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>
void logFontDescriptor(NSString *message, NSFontDescriptor *fontDescriptor, NSArray *attributeKeys)
{
printf("%s %s\n", [message UTF8String], [fontDescriptor.postscriptName UTF8String]);
for (NSString *attributeKey in attributeKeys)
{
printf(" %30s -> %s\n", [[attributeKey description] UTF8String], [[[fontDescriptor objectForKey:attributeKey] description] UTF8String]);
}
printf("\n");
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{
if (argc != 2)
return EXIT_FAILURE;
NSArray *mandatoryKeys = @[ NSFontNameAttribute, NSFontFamilyAttribute, NSFontFaceAttribute ];
NSURL *fontURL = [NSURL fileURLWithPath:@(argv[1])];
NSArray *fontDescriptors = CFBridgingRelease(CTFontManagerCreateFontDescriptorsFromURL((__bridge CFURLRef)fontURL));
for (NSFontDescriptor *fontDescriptor in fontDescriptors)
{
logFontDescriptor(@"***", fontDescriptor, mandatoryKeys);
NSArray *matchingFontDescriptors = [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:[NSSet setWithArray:mandatoryKeys]];
for (NSFontDescriptor *matchingFontDescriptor in matchingFontDescriptors)
{
logFontDescriptor(@" MATCHING", matchingFontDescriptor, mandatoryKeys);
}
}
}
return EXIT_SUCCESS;
}
为了重现奇怪的行为,请下载 Ubuntu Font Family 并将 Ubuntu-B.ttf (Ubuntu Bold) 文件复制到您的 ~/Library/Fonts 目录中。然后用Ubuntu-R.ttf(Ubuntu Regular)运行这个测试程序:
./font_descriptor_matching ~/Downloads/ubuntu-font-family-0.80/Ubuntu-R.ttf
现在,您的系统上安装了 Ubuntu Bold 字体,您正在询问与 Ubuntu Regular 匹配的字体描述符,结果如下(OS X 10.9. 1):
*** Ubuntu
NSFontNameAttribute -> Ubuntu
NSFontFamilyAttribute -> Ubuntu
NSFontFaceAttribute -> Regular
MATCHING Ubuntu-Bold
NSFontNameAttribute -> Ubuntu-Bold
NSFontFamilyAttribute -> Ubuntu
NSFontFaceAttribute -> Bold
询问 Ubuntu Regular 哪种字体与其字体名称 (NSFontNameAttribute)、字体系列 (NSFontFamilyAttribute) 和字体 (NSFontFaceAttribute) 相匹配,得到 Ubuntu Bold em> 字体匹配。如您所见,唯一匹配的属性是字体系列。字体名称和字体不同,但matchingFontDescriptorsWithMandatoryKeys: 方法表示这些字体匹配。
我误解了matchingFontDescriptorsWithMandatoryKeys: 方法的作用还是它是一个错误?
其他信息:
如果同时安装了 Ubuntu Bold 和 Ubuntu Regular 字体,则匹配将按预期工作。
并非所有字体都存在此问题。
【问题讨论】:
-
我玩了一下,看起来你发现了一个错误,但这是一个奇怪的错误——我的意思是,你多久匹配一次卸载字体的特征?我假设如果也安装了 Ubuntu-R.ttf,它会按预期工作吗?或者这不是真的?
-
我的应用安装字体,所以我想确保不安装重复的字体。这就是我匹配卸载字体的原因。我用额外的信息更新了这个问题,如果这两种字体都安装了,匹配会按预期工作。
-
听起来您确实发现了一个错误。报告雷达!