- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用-[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 字体匹配。正如您所看到的,唯一匹配的属性是字体系列。字体名称和字体外观都不同,但 matchingFontDescriptorsWithMandatoryKeys:
方法表示这些字体匹配。
我是否误解了 matchingFontDescriptorsWithMandatoryKeys:
方法的作用还是它是一个错误?
其他信息:
如果同时安装了 Ubuntu Bold 和 Ubuntu Regular 字体,则匹配将按预期进行。
并非所有字体都存在此问题。
最佳答案
为了解决这个奇怪的行为,我使用了这种方法,通过显式测试所有强制键来抑制不匹配的字体描述符。
static NSArray * ReallyMatchingFontDescriptorsWithMandatoryKeys(NSFontDescriptor *fontDescriptor, NSSet *mandatoryKeys)
{
NSArray *matchingFontDescriptors = [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:mandatoryKeys];
NSMutableArray *reallyMatchingFontDescriptors = [matchingFontDescriptors mutableCopy];
for (NSFontDescriptor *matchingFontDescriptor in matchingFontDescriptors)
{
BOOL reallyMatching = YES;
for (NSString *mandatoryKey in mandatoryKeys)
{
if (![[fontDescriptor objectForKey:mandatoryKey] isEqual:[matchingFontDescriptor objectForKey:mandatoryKey]])
reallyMatching = NO;
}
if (!reallyMatching)
[reallyMatchingFontDescriptors removeObjectIdenticalTo:matchingFontDescriptor];
}
return [reallyMatchingFontDescriptors copy];
}
关于cocoa - matchingFontDescriptorsWithMandatoryKeys 如何匹配字体描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21382482/
我正在使用-[NSFontDescriptor matchingFontDescriptorsWithMandatoryKeys:]方法来查找系统中是否已安装字体,但我得到了非常奇怪的结果。 这是一个
我是一名优秀的程序员,十分优秀!