1

我安装了常见的 Adob​​e Myriad Pro 字体。其中包括 Myriad Pro Regular、Myriad Pro Bold 和 Myriad Pro Semibold。假设我有一个CTFontRef baseFont指向 Myriad Pro Regular 的字体,并且我想要的字体大小是size. 我运行以下代码:

CTFontRef boldFont = CTFontCreateCopyWithSymbolicTraits(baseFont, size, NULL, kCTFontBoldTrait, kCTFontBoldTrait);

返回的字体是 Myriad Pro Semibold,而不是 Myriad Pro Bold。

除了请求命名样式“Bold”之外,有没有办法强制它返回 Myriad Pro Bold?我想保持这段代码完全通用,没有硬连线样式名称。

我已经尝试过各种排列方式,包括在最初创建字体时将粗体特征作为属性字典的一部分传递,避免了此处描述的两步过程,但它仍然返回半粗体字体而不是普通粗体。我也对字体本身进行了一些探索。全粗体在其<OS/2>表中的权重为 700,半粗体的权重为 600。PANOSE 的权重与此相对应。但是,半粗体和粗体字体表中的macStyle字段<head>都设置了粗体标志,所以大概这就是 Core Text 正在使用的。但是有什么办法可以让它更有辨别力吗?

4

2 回答 2

0

基于对文档的阅读,并以一般字体处理的一些知识为后盾,但不是专门针对 Core Text,我想说这可能是可能的,但这并不简单。

CTFontCreateCopyWithSymbolicTraits()文档指定symTraitValueandsymTraitMask参数具有 type CTFontSymbolicTraits。该CTFontDescriptor()文档定义了您使用的“粗体”值

kCTFontBoldTrait = (1 << 1)

所以这显然是一个布尔特征。然而,正如您所看到的,字体粗细是一个范围,而不是布尔特征,尽管几十年来文字处理器 UI 中的“粗体”按钮已将其呈现为布尔特征。CTFontCreateCopyWithSymbolicTraits()没有你需要的表达能力。

另一种可能有效的方法是尝试调用CTFontDescriptorCreateMatchingFontDescriptors(). 您将此函数 a 传递CTFontDescriptorRef给初始字体,并将 a传递给CFSetRef必须存在的属性。此函数返回一个字体描述符数组,所有这些都与您请求的属性相匹配。

因此,您可以将其传递CTFontDescriptorRef给 Myriad Pro Regular,或者CFSetRef您想要粗体的说法,然后查看返回数组中的每个字体描述符以找到最重的字体描述符。

我还没有写过这段代码,而且我对核心文本的无知意味着我可能会遗漏一些东西,但这似乎是一种合理的方法。

于 2012-02-03T23:17:58.317 回答
0

对于CTFontDescriptor您可以指定一个属性,该属性kCTFontTraitsAttribute应该是一个CFDictionaryRef您可以在kCTFontWeightTrait其中指定CFNumberRef代表-1和1之间的浮点数的属性,为您提供权重范围,1是最粗体的变体,0是常规/中等.

于 2013-05-03T11:42:58.200 回答