在OSX中是否有Windows CreateFont(..)
功能的替换?
我尝试使用NSFontDescriptor
及其matchingFontDescriptorsWithMandatoryKeys:
方法,但此方法找不到“最接近”的字体,它会找到匹配的特征并且还可以返回{{1} }。
有没有办法在OSX中找到指定特征(如CreateFont)最接近的字体?
已更新
NSFontDescriptor发生了一些奇怪的事情..
我有两段代码:
on Cocoa:
nil
使用CoreText API:
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];
我在两种情况下都创建了相同的字体描述符,但在第一种情况下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
,而在CoreText API中,nil
中有一些字体。这是一个错误吗?
但总的来说,如果我将matchedDescriptors
作为强制属性传递给nil
,它应该至少返回一个描述符吗?
答案 0 :(得分:0)
如果你没有,请提交雷达。我自己也有点相同的行为差异。
调试时令人惊讶的是,我发现[fontDescriptor matchingFontDescriptorWithMandatoryKeys:]
实际上是定义的,虽然没有记录,并且按照预期的单个描述符运行。意思是,它就像CTFontDescriptorCreateMatchingFontDescriptor()
一样。
虽然[fontDescriptor matchingFontDescriptorsWithMandatoryKeys:]
肯定对我不利。
当我使用[UIFont fontWithDescriptor:size:]
时,我发现了这个问题,它正好匹配,并且符合预期。然后我切换到[fontDescriptor matchingFontDescriptorsWithMandatoryKeys:nil]
,并为同一个描述符返回nil。
感觉有些东西,所以我和你一样比较了CoreText API,得出的结论是我在这里与你分享。
我知道您正在查看这些方法的列表版本,我想我会分享我在UIFontDescriptor
类别中使用此方法:
- (nullable instancetype)my_matchingFontDescriptorWithMandatoryKeys:(nullable NSSet<UIFontDescriptorAttributeName> *)mandatoryKeys {
return (__bridge_transfer UIFontDescriptor *)CTFontDescriptorCreateMatchingFontDescriptor((__bridge CTFontDescriptorRef)self, (__bridge CFSetRef)mandatoryKeys);
}