在OSX中按指定的特征查找字体

时间:2012-04-03 14:07:54

标签: cocoa fonts core-text fontmetrics

在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,它应该至少返回一个描述符吗?

1 个答案:

答案 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);
}