nngh

coretext绘制 个人理解为

一个CTFrame有几个CTLine组成,有几行文字就有几行CTLine。一个CTLine有包含多个CTRun,一个CTRun是所有属性都相同的那部分富文本的绘制单元。所以CTRun是CTFrame的基本绘制单元

资料博客链接地址:http://www.jianshu.com/p/6db3289fb05d

计算绘制的coreText内容的高度

+ (int)getAttributedStringHeightWithString:(NSAttributedString *)string  WidthValue:(int)width

{

    int total_height = 0;

    

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);    //string 为要计算高度的NSAttributedString

    CGRect drawingRect = CGRectMake(0, 0, width, 1000);  //这里的高要设置足够大

    CGMutablePathRef path = CGPathCreateMutable();

    CGPathAddRect(path, NULL, drawingRect);

    CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);

    CGPathRelease(path);

    CFRelease(framesetter);

    

    NSArray *linesArray = (NSArray *) CTFrameGetLines(textFrame);

    

    CGPoint origins[[linesArray count]];

    CTFrameGetLineOrigins(textFrame, CFRangeMake(0, 0), origins);

    

    int line_y = (int) origins[[linesArray count] -1].y//最后一行line的原点y坐标

    

    CGFloat ascent;

    CGFloat descent;

    CGFloat leading;

    

    CTLineRef line = (__bridge CTLineRef) [linesArray objectAtIndex:[linesArray count]-1];

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

    

    total_height = 1000 - line_y + (int) descent +1;    //+1为了纠正descent转换成int小数点后舍去的值

    

    CFRelease(textFrame);

    

    return total_height;

    

}

分类:

技术点:

相关文章:

  • 2021-09-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-11
  • 2021-10-24
  • 2022-12-23
猜你喜欢
  • 2021-12-02
  • 2021-12-12
  • 2021-09-18
  • 2021-06-25
  • 2021-07-14
相关资源
相似解决方案