使用NSLayoutManager计算每个字形的帧

时间:2014-02-13 19:59:57

标签: iphone ipad ios7 glyph nslayoutmanager

在这个帖子Core Text calculate letter frame in iOS上,他们能够使用核心文本非常精确地计算每个字形的框架。最终的rects完美地拥抱了实际绘制的字形。

使用NSLayoutManager的boundingRectForGlyphRange:inTextContainer:似乎没有准确地返回字形边界框:

glyph frames using boundingRectForGlyphRange:inTextContainer

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

Zapfino f glyph using boundingRectForGlyphRange:inTextContainer

有没有人知道如何复制上述讨论的结果而不进入仅限iOS 7应用的Core Text?

感谢。

2 个答案:

答案 0 :(得分:1)

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

问题:在RTL文本的情况下,boundingRectForGlyphRange结果已关闭。

因此,仅在检测到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;

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

答案 1 :(得分:0)

您链接到selected answer的帖子中的solves this problem for Zapfino