+ (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); }
source share