使用NSLayoutManager计算每个字形的帧

jlm*_*ini 14 iphone glyph nslayoutmanager ipad ios7

在这个帖子中,Core Text计算iOS中的字母框架,他们能够使用Core Text非常精确地计算每个字形的框架.最终的rects完美地拥抱了实际绘制的字形.

使用NSLayoutManager boundingRectForGlyphRange:inTextContainer:似乎不会返回精确的字形边界框:

使用boundingRectForGlyphRange:inTextContainer的字形框架

返回的rects并没有完全包含更复杂的字体(Zapfino示例):

使用boundingRectForGlyphRange:inTextContainer的Zapfino f字形

有没有人知道如何复制上述讨论的结果而不进入iOS 7专用应用程序下的核心文本?

谢谢.

ugi*_*zet 1

我已经找到了这个问题的解决方案,或者至少是某种解决方案

问题:boundingRectForGlyphRange对于 RTL 文本,结果不正确。

因此,如果仅检测到 RTL 文本:

使用NSLayoutManager方法locationForGlyphAtIndex,对于范围内的每个字母。这些是范围内每个字形的起点。使用这些点我可以正确调整boundingRect。

以下是它的概要:

CGPoint endPoint = ((NSValue *)pointsOfGlyps.firstObject).CGPointValue;
CGPoint startPoint = ((NSValue *)pointsOfGlyps.lastObject).CGPointValue;
boundingRect.origin.x =  startPoint.x;
boundingRect.size.width = endPoint.x - startPoint.x + letterWidth;
Run Code Online (Sandbox Code Playgroud)

letterWidth是字母宽度的近似值,计算为两个连续起点之间的增量。