IOS CoreText

在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








發佈了20 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章