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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在OSX中按指定的特征查找字体相关的知识,希望对你有一定的参考价值。

在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);

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

但一般来说,如果我将nil作为强制属性传递给XXXMatchingFontDescriptorsXXX,它应该至少返回一个描述符吗?

答案

如果你没有,我会请提交雷达。我自己也有点不同的行为。

调试时出人意料的是,我发现[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);
}

以上是关于在OSX中按指定的特征查找字体的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用在android片段类中按下的后退按钮

如果在 WebView 片段中按下后退按钮,如何返回上一页?

Laravel 8 数据库小笔记

Laravel 8 数据库小笔记

Laravel 8 数据库小笔记

在android中按下通知时如何打开片段页面