2

CreateFont(..)在 OSX 中是否可以替代 Windows 的功能?

我试过使用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);

我在这两种情况下都创建了相同的字体描述符,但在第一种情况下matchedDescriptorsnil使用 CoreText API 有一些字体在matchedDescriptors. 它是一个错误吗?

但总的来说,如果我作为强制属性传递nilXXXMatchingFontDescriptorsXXX它是否应该返回至少一个描述符?

4

1 回答 1

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);
}
于 2018-02-28T07:24:09.913 回答