基於Core Text實現的TXT電子書閱讀器

2022-04-29 18:30:07 字數 2646 閱讀 2668

本篇文章的專案位址基於core text實現的txt電子書閱讀器。

最近花了一點時間學習了ios的底層文書處理的框架core text。在網上也參考很多資料,具體的資料在文章最後列了出來,有興趣的可參考一下。

本篇主要介紹實現txt電子書閱讀器設計用到的core text相關的用法與實現。

core textios底層的文書處理框架,只提供一套c函式介面,使用core text物件時要注意手動管理記憶體以避免發生記憶體洩漏。之前寫了一篇ios富文字(二)初識text kit是介紹ios的另乙個文書處理框架text kittext kit是封裝core text函式提供一套objective-c的介面,使用起來也比較友好。高度的封裝意味著可定製性差,靈活性低。所以如果需要實現更多的功能最好還是用core text

關於文字的相關知識參考文章最後列出的資料,因為涉及到字型大小的計算。例如在算字型高度時應該是baseline+ascent+descent的總和,了解這些知識對理解core text相關函式很有幫助

介紹一下這個層級。framesetter物件(ctframesetterref)最為頂層接收乙個屬性化字串(attributedstring)作為輸入,乙個framesetter物件生成乙個或多個文字中的幀(ctframeref)每乙個ctframe都代表乙個段落。

要生成幀(ctframeref)時,framesetter呼叫乙個typesetter物件(cttypesetterref),它放置文字在frame中,framesetter設定段落樣式給typesetter物件,包括屬性對齊方式,製表位,行間距,縮排和換行模式,typesetter物件用這些屬性轉換每個字元成字形,然後在每行中填充這些字型,再用這些行填滿整個繪製區間。

每個ctframe物件包含段落線(ctline)物件。每個(ctline)物件代表段落中的每一行,乙個ctframe可以包含乙個或者多個ctline物件。ctline由typesetter物件操作期間被建立。

每個ctline是包含字形管理(ctrun)物件的陣列,乙個ctrun物件是一組共享相同屬性,方向的連續字形。

根據配置檔案得到文字顯示的屬性。

+(nsdictionary *)parserattribute:(lsyreadconfig *)config

根據屬性生成屬性化字串,然後屬性化字串作為輸入得到ctframe物件

+(ctframeref)parsercontent:(nsstring *)content config:(lsyreadconfig *)parser bouds:(cgrect)bounds

生成的ctframe在要view的drawrect方法中呼叫ctframedraw就可以進行繪製。

因為我們不僅要繪製出文字還要和文字進行互動所以僅僅這兩個函式是不夠的。

還需要以下函式

//根據觸控點獲取當前文字的索引

+(cfindex)parserindexwithpoint:(cgpoint)point frameref:(ctframeref)frameref

nsinteger linecount = [lines count];

cgpoint *origins = malloc(linecount * sizeof(cgpoint)); //給每行的起始點開闢記憶體

if (linecount) }}

free(origins); 釋放記憶體

return index;

}

長按文字會預設選中兩個文字這樣就要計算選中的區間

+(cgrect)parserrectwithpoint:(cgpoint)point frameref:(ctframeref)frameref

nsinteger linecount = [lines count];

cgpoint *origins = malloc(linecount * sizeof(cgpoint)); //給每行的起始點開闢記憶體

if (linecount)

else

rect = cgrectmake(origins[i].x+xstart,baselineorigin.y-descent,fabs(xstart-xend), ascent+descent);

break;}}

}free(origins);

return rect;

}

上面就是實現這個專案使用的大部分關於core text**,實際專案實現起來遠比這要複雜的多。具體實現請參考這個專案基於core text實現的txt電子書閱讀器

core text 入門

基於 coretext 的排版引擎:基礎

niattributedlabel.m

wfcoretext

CoreText中座標轉換的一些理解

學習coretext,最初的想法是寫乙個雜誌類的應用,因為對網易和zarca應用一些技術的疑問,所以,自己有了很強的興趣欲和鑽研欲,開始這段有點不順的學習過程。1 對cgcontextref的ctm不理解,觀念導致很多東西沒有正確的理解。2 對ns的了解不多,一些文字繪製方面的座標系問題讓自己很迷惑...

TX2實現python3的opencv3 4安裝

由於pip安裝不能檢索到arm的opencv包,所以opencv3.4我們必須都過編譯安裝,具體的操作見 輸入 pkg config modversion opencv 得到版本號 3.4.3 此時安裝opencv成功 但是在python3中依舊import不了cv2 如圖 nvidia tegra...

基於註解實現

用於記錄日誌的工具類,它裡面提供了公共的 component logger aspect 表示當前類是乙個切面類 public class logger 前置通知 before pt1 public void beforeprintlog 後置通知 afterreturning pt1 public...