这是对此的跟进。
在遇到某些字符组合在 Cocoa 和 Core Text 之间工作不一样的问题后,我决定给 Cocoa 的文本 API 一个机会。现在,我需要能够将一条线垂直分解为其每个组成部分:
- 由于 NSParagraphStyle.paragraphSpacingBefore 导致的空白
- 由于 NSParagraphStyle.lineHeightMultiple 导致的空白
- 排版线上升
- 印刷线下降
- 排版行前导(行间距)
- 由于 NSParagraphStyle.lineSpacing 的空白,但不是由于前导
- 由于 NSParagraphStyle.paragraphSpacing 的空白
在 Core Text 中,对于上升、下降和前导行,我可以调用CTLineGetBoundsWithOptions(0)
and CTLineGetBoundsWithOptions(kCTLineBoundsExcludeTypographicLeading)
(这两个矩形的原点是基线,所以我知道在哪里切),然后为 CTParagraphStyle 条目重新创建 Core Text 的内部计算。
但我不确定如何处理 NSLayoutManager,并且尝试重新创建内部计算并没有太大帮助。
据我所知,Cocoa 的文本系统提供了以下获取公制矩形的方法:
-[NSLayoutManager lineFragmentRectForGlyphAtIndex:effectiveRange:]
-[NSLayoutManager lineFragmentUsedRectForGlyphAtIndex:effectiveRange:]
-[NSLayoutManager boundingRectForGlyphRange:inTextContainer:]
但是,这些不足以为我提供所需的数据。对于前两个,Apple 有这样的说法:
除了线片段矩形本身之外,排版器还返回一个称为已使用矩形的矩形。这是实际包含要绘制的字形或其他标记的线片段矩形部分。按照惯例,两个矩形都包括行片段填充和根据字体的行高度量和段落的行间距参数计算的行间距。但是,段落间距(前后)和文本周围添加的任何空间,例如由中心间距文本引起的空间,仅包含在行片段矩形中,而不包含在使用的矩形中。
最后一个似乎与前两个完全无关:S
我确实尝试重新创建 Core Text 的逻辑来确定行上升和下降应该是什么,假设线路上升从行上所有字形的最大字体上升开始,但这并不完全奏效:而不是让先前的下降和当前的上升在字体上是同一行,没有像 Palatino 那样的前导,也没有段落样式,两条线相隔一些点:S
那么我想要的可能吗?如果没有,我将不得不研究如何让 Core Text 以与 Cocoa 相同的方式呈现和定位组合重音,或者更糟糕的是,手动布置线条以至少避免重叠(更糟糕的是,因为我假设 Apple 知道他们在做什么。 ..)
这是针对Mac OS X的;我需要以 10.8 或更高版本为目标。谢谢!