如何获得在CTFrame上绘制的文本的真实高度

我有一定数量的文本填充一些CTFrame (不止一个)。 要创建所有框架(每个页面一个框架),我将填充一个框架,使用CTFrameGetVisibleStringRange获取不符合框架的文本,并重复此过程直到处理CTFrameGetVisibleStringRange所有文本。

在除了最后一帧之外的所有帧上,文本占用页面的相同高度。 在最后一帧我想知道文本占据的真实高度,知道我可以开始绘制更多文本的位置。

有没有办法做到这一点?

UPDATE

根据评论的要求,这里是我使用@omz的建议的解决方案:

我在我的项目中使用了ARC:

CTFrameRef locCTFrame = (__bridge CTFrameRef)ctFrame;

//Save CTLines
lines = (NSArray *) ((__bridge id)CTFrameGetLines(locCTFrame));

//Get line origins
CGPoint lOrigins[MAXLINESPERPAGE];
CTFrameGetLineOrigins(locCTFrame, CFRangeMake(0, 0), lOrigins);
CGFloat colHeight = self.frame.size.height;

//Save the amount of the height used by text
percentFull = ((colHeight - lOrigins[[lines count] - 1].y) / colHeight);

你既可以得到该帧的最后一行用的线起源CTFrameGetLineOrigins或使用CTFramesetterSuggestFrameSizeWithConstraints函数来获取一个矩形框的大小对于给定的范围内。 如果您使用非矩形路径来设置实际帧,后者将不起作用。


+ (CGSize)measureFrame:(CTFrameRef)frame
{
    // 1. measure width
    CFArrayRef  lines       = CTFrameGetLines(frame);
    CFIndex     numLines    = CFArrayGetCount(lines);
    CGFloat     maxWidth    = 0;

    for(CFIndex index = 0; index < numLines; index++)
    {
        CTLineRef   line = (CTLineRef) CFArrayGetValueAtIndex(lines, index);
        CGFloat     ascent, descent, leading, width;

        width = CTLineGetTypographicBounds(line, &ascent,  &descent, &leading);

        if(width > maxWidth)
            maxWidth = width;
    }

    // 2. measure height
    CGFloat ascent, descent, leading;

    CTLineGetTypographicBounds((CTLineRef) CFArrayGetValueAtIndex(lines, 0), &ascent,  &descent, &leading);
    CGFloat firstLineHeight = ascent + descent + leading;

    CTLineGetTypographicBounds((CTLineRef) CFArrayGetValueAtIndex(lines, numLines - 1), &ascent,  &descent, &leading);
    CGFloat lastLineHeight  = ascent + descent + leading;

    CGPoint firstLineOrigin;
    CTFrameGetLineOrigins(frame, CFRangeMake(0, 1), &firstLineOrigin);

    CGPoint lastLineOrigin;
    CTFrameGetLineOrigins(frame, CFRangeMake(numLines - 1, 1), &lastLineOrigin);

    CGFloat textHeight = ABS(firstLineOrigin.y - lastLineOrigin.y) + firstLineHeight + lastLineHeight;

    return CGSizeMake(maxWidth, textHeight);
}

使用CTLineGetTypographicBounds

链接地址: http://www.djcxy.com/p/14371.html

上一篇: How to get the real height of text drawn on a CTFrame

下一篇: How do I iterate over an NSArray?