首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当请求一个粗体版本的Myriad Pro时,Core Text为什么返回Myriad Pro Semibold

当请求一个粗体版本的Myriad Pro时,Core Text为什么返回Myriad Pro Semibold
EN

Stack Overflow用户
提问于 2011-07-26 22:03:53
回答 2查看 702关注 0票数 1

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

代码语言:javascript
复制
CTFontRef boldFont = CTFontCreateCopyWithSymbolicTraits(baseFont, size, NULL, kCTFontBoldTrait, kCTFontBoldTrait);

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

有没有办法强制它返回Myriad Pro Bold,而不是请求命名样式'Bold'?我想让这段代码保持完全通用,而不使用硬连接的样式名称。

我尝试过各种排列方式,包括在最初创建字体时将粗体特征作为属性字典的一部分传递,避免了这里描述的两步过程,但它仍然返回半粗体字体,而不是正常的粗体字体。我还稍微研究了一下字体本身。在<OS/2>表中,全粗字体的权重为700,半粗字体的权重为600。PANOSE权重与此对应。但是,半粗体和粗体字体的<head>表中的粗体字段都设置了粗体标志,所以这大概就是核心文本使用的macStyle。但有没有办法让它更有鉴别力呢?

EN

回答 2

Stack Overflow用户

发布于 2012-02-04 07:17:58

根据对文档的阅读,以及一般字体处理的一些知识,但不是专门的核心文本,我想说这可能是可能的,但它不是直接的。

CTFontCreateCopyWithSymbolicTraits() documentation指定symTraitValuesymTraitMask参数的类型为CTFontSymbolicTraitsCTFontDescriptor() documentation定义您正在使用"Bold“值

代码语言:javascript
复制
kCTFontBoldTrait = (1 << 1)

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

另一种可行的方法是尝试调用CTFontDescriptorCreateMatchingFontDescriptors()。您向此函数传递了一个初始字体的CTFontDescriptorRef,以及一个具有必须存在的属性的CFSetRef。此函数返回一个字体描述符数组,所有这些描述符都与您请求的属性匹配。

所以,你可以给它传递一个Myriad Pro Regular的CTFontDescriptorRef,也许还有一个CFSetRef,告诉它你想要加粗,然后查看返回的数组中的每个字体描述符,找到权重最大的一个。

我没有写过这段代码,而且我对Core Text的不了解意味着我可能遗漏了一些东西,但这似乎是一种合理的方法。

票数 0
EN

Stack Overflow用户

发布于 2013-05-03 19:42:58

对于CTFontDescriptor,您可以指定一个属性kCTFontTraitsAttribute,它应该是一个CFDictionaryRef,其中您可以指定kCTFontWeightTrait,它采用一个表示-1和1之间的浮点数的CFNumberRef,为您提供了一系列权重,1是最粗体的变体,0是常规/中等权重。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6831246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档