在iOS中字形的 Ascent
和 Descent 所占的比例分别是86% 和 14% 例如 [UIFont systemFontOfSize:20]这段代码设置字体大小为20 则对应的 Ascent 和 Descent 分别为 ascent = 17.200000 , descent = 2.800000。
对于不同的CTRun 可能有不同的Ascent 和 Descent,当这些CTrun在同一行时对于一行即(CTLine) 其中该CTLine 的 Ascent 和 Descent 用CTRun的最大的值来表示,但是对于每一个CTRun 的Ascent 和 Descent 还是原来的值,并不会改变
CTTypesetterSuggestLineBreak 函数动态的计算每一行里的字数,因为每一行里面的中文字、标点符号、数
字、字母都不一样所以可以显示的字数肯定也是不同的,所以需要作这样的计算。
CFArrayRef lines = CTFrameGetLines(ctFrame); //获得CTFrame 中的CFLine 对象(是一个数组)
CFArrayGetCount(lines) 获得Lines中有多少个元素
CTLineRef line = CFArrayGetValueAtIndex(lines, j);//获得lines 数组中的第J个CTLine
CFArrayRef runs = CTLineGetGlyphRuns(line); //获得一行有多少个CTRun 返回的是一个数组
CFArrayGetCount(runs) //获得runs 有多少个元素
CTRunRef run = CFArrayGetValueAtIndex(runs, j);//获得Runs 数组中的第J个CTRun
NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run);//获得CTRun 中的相关属性,返回值是(CFDictionaryRef)强制转化为NSDictionary对象
CTLineGetTypographicBounds(line, &lineAscent, &lineDescent, &lineLeading);
//计算文字排版上的边界,The typographic width of the line.//返回CTLine宽度,把相关的值赋值到传进来的参数中,参数使用来接受数值的
runRect.size.width = CTRunGetTypographicBounds(run, CFRangeMake(0,0), &runAscent, &runDescent, NULL);
NSLog(@"width = %f",runRect.size.width);
//计算文字排版上的边界,The typographic width of the run.//返回CTRun宽度,把相关的值赋值到传进来的参数中,参数使用来接受数值的
CFRange range = CTRunGetStringRange(run);//获得在该CTRun中的字符串(包含图片)的在整个CTFrame中的range
如下图所示 该CTFrame 包含3个CTLine
第一个CTLine 包含3个CTRun
对每一个CTRun分别调用该方法
CFRange range = CTRunGetStringRange(run)的到得CFRange 分别是(0,4),(4,1)(5,8)
CTFrameGetVisibleStringRange.
This function tells you how much text will fit into a given frame