如何获得在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
。