【问题标题】:Find a font by specified characteristics in OSX在 OSX 中按指定特征查找字体
【发布时间】: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);

我在这两种情况下都创建了相同的字体描述符,但在第一种情况下,matchedDescriptorsnil,并且使用 CoreText API,matchedDescriptors 中有一些字体。是bug吗?

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

【问题讨论】:

    标签: cocoa fonts core-text fontmetrics


    【解决方案1】:

    如果您还没有,我会请您提交雷达。我自己也被同样的行为差异所困扰。

    调试时令人惊讶的事情是,我发现 [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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2014-09-26
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多