【发布时间】:2012-04-03 14:07:53
【问题描述】:
在 OSX 中是否可以替代 Windows 的 CreateFont(..) 函数?
我尝试使用NSFontDescriptor 及其matchingFontDescriptorsWithMandatoryKeys: 方法,但此方法找不到“最接近”的字体,它找到了匹配的特征并且还可以返回nil。
有没有办法在 OSX 中通过指定特征(如 CreateFont)找到最接近的字体?
更新
NSFontDescriptor 发生了一些奇怪的事情..
我有两段代码:
关于可可:
NSDictionary* fontTraits = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:NSFontSansSerifClass], NSFontSymbolicTrait,
[NSNumber numberWithFloat:0.4], NSFontWidthTrait,
nil];
NSDictionary* fontAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
fontTraits, NSFontTraitsAttribute,
nil];
NSFontDescriptor* fontDescriptor = [NSFontDescriptor fontDescriptorWithFontAttributes:fontAttributes];
NSArray* matchedDescriptors = [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:nil];
并使用 CoreText API:
CFMutableDictionaryRef fontTraits = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
float weight = 0.4;
CFNumberRef fontWeight = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloat32Type, &weight);
CFDictionaryAddValue(fontTraits, kCTFontWeightTrait, fontWeight);
int symbolicTraits = kCTFontSansSerifClass;
CFNumberRef fontSymbolicTraits = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &symbolicTraits);
CFDictionaryAddValue(fontTraits, kCTFontSymbolicTrait, fontSymbolicTraits);
CFMutableDictionaryRef fontAttributes = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionaryAddValue(fontAttributes, kCTFontTraitsAttribute, fontTraits);
CTFontDescriptorRef fontDescriptor = CTFontDescriptorCreateWithAttributes(fontAttributes);
CFArrayRef matchedDescriptors = CTFontDescriptorCreateMatchingFontDescriptors(fontDescriptor, 0);
我在这两种情况下都创建了相同的字体描述符,但在第一种情况下,matchedDescriptors 是 nil,并且使用 CoreText API,matchedDescriptors 中有一些字体。是bug吗?
但总的来说,如果我将nil 传递给XXXMatchingFontDescriptorsXXX 作为强制属性,它是否应该返回至少一个描述符?
【问题讨论】:
标签: cocoa fonts core-text fontmetrics