在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