我安装了常见的Adobe 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正在使用的。但有没有办法让它更具辨别力?
答案 0 :(得分:0)
基于对文档的阅读,通过一般字体处理的一些知识而不是核心文本的专门支持,我会说这可能是可能的,但这并不简单。
CTFontCreateCopyWithSymbolicTraits()
documentation指定symTraitValue
和symTraitMask
参数的类型为CTFontSymbolicTraits
。 CTFontDescriptor()
documentation定义您正在使用的“粗体”值
kCTFontBoldTrait = (1 << 1)
所以这显然是一个布尔特征。但是,正如您所见,字体权重是一种频谱,而不是布尔特征,即使字处理器UI中数十年的“粗体”按钮已将其表示为布尔特征。 CTFontCreateCopyWithSymbolicTraits()
没有你需要的表现力。
可能有效的另一种方法是尝试调用CTFontDescriptorCreateMatchingFontDescriptors()
。您将此函数CTFontDescriptorRef
传递给初始字体,并将CFSetRef
传递给必须存在的属性。此函数返回一个字体描述符数组,所有这些都与您请求的属性相匹配。
所以,你可以为Myriad Pro Regular传递一个CTFontDescriptorRef
,也许是CFSetRef
说你想要加粗,然后查看返回数组中的每个字体描述符以查找带有最重的。
我没有写过这段代码,而我对Core Text的无知意味着我可能会遗漏一些东西,但这似乎是一种似是而非的方法。
答案 1 :(得分:0)
对于CTFontDescriptor
,您可以指定属性kCTFontTraitsAttribute
,该属性应为CFDictionaryRef
,您可以在其中指定kCTFontWeightTrait
,其中CFNumberRef
代表浮动介于-1和1之间,为您提供一系列权重,1为最大胆的变体,0为常规/中等。