開發筆記:CoreText。看懂YYLabel前的準備。

有段時間沒寫文章了,主要簡單的東西不想寫,復雜的東西不會寫。所以寫的就慢慢變少了,不過最近在研究CoreText略有心得,這里做些分享。
想真的看懂YYLabel,做到各個功能模塊的增刪改查皆都隨心而行是要有一定心理準備的。

這里有幾篇搜集到的文章需要先看明白

排名無先后。

還有兩個練手的Demo,從簡單到復雜,需要先做出來看明白。

排名有先后

這個是我自己仿寫TYAttributedLabel做出來的,只是還有點瑕疵,諸位有興趣可以看看 ADAttributedLabel

總結

NSTextStorage 是一個中樞,它管理所有的文本和屬性信息。系統只提供了兩個存取器方法存取它們,并另外提供了兩個方法來分別修改文本和屬性。

NSTextStorage 是從它的父類 NSAttributedString 繼承了這些方法。

NSTextStorage 從文本系統看來 僅僅是一個帶有屬性的字符串,附帶一些擴展。這兩者唯一的重大不同點是 NSTextStorage 包含了一個方法,可以把所有對其內容進行的修改以通知的形式發送出來。processEditing在layout manager中文本修改時發送通知,它通常也是處理一些文本修改邏輯的好地方

NSTextContainer:每個 Text View 定義了一個文本可以繪制的區域。為此,每個 Text View 都有一個 Text Container,它精確地描述了這個可用的區域。并且不接受任何超出的文本

NSLayoutManager

Layout Manager 是中心組件,它把所有組件粘合在一起

  1. 這個管理器監聽 Text Storage 中文本或屬性改變的通知,一旦接收到通知就觸發布局進程。
  2. 從 Text Storage 提供的文本開始,它將所有的字符翻譯為字形
  3. 一旦字形全部生成,這個管理器向它的 Text Containers 查詢文本可用以繪制的區域。
  4. 然后這些區域被行逐步填充,而行又被字形逐步填充。一旦一行填充完畢,下一行開始填充。
  5. 對于每一行,布局管理器必須考慮斷行行為(放不下的單詞必須移到下一行)、連字符、內聯的圖像附件等等。
  6. 當布局完成,文本的當前顯示狀態被設為無效,然后 Layout Manager 將前面幾步排版好的文本設給 Text View。
簡單總結

image通過上下文繪制到修改后的frame中,在imageStorage的CGContextDrawImage

view通過addSubView添加到父View上面,設置ownerView就是設置父View,需要注意Transform上下顛倒的轉換,因為默認是倒轉的

長按與點擊通過判斷點擊的位置所對應的run,通過run取出對應的屬性。

自定義Label(如ADAttributedLabel)管理textContainer,一個textContainer可以有多個textStorage,一個textStorage可以有多個layoutManager

確定字符串范圍所需的框架大小:CTFramesetterSuggestFrameSizeWithConstraints

CGContextSetTextMatrix 字體的翻轉

addAttribute 調用到系統的原生方法。如:
\- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range; 

用到的屬性例如

@{NSStrokeWidthAttributeName:@-5,NSStrokeColorAttributeName:[UIColor greenColor],NSFontAttributeName:[UIFont systemFontOfSize:36],NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle)}

最后:開發不易,大家共勉。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 卷首語 歡迎來到 objc.io 第五期! 我們希望你跟我們一樣為 iOS 7 的發布而感到興奮。選擇這個做為本期...
    評評分分閱讀 579評論 0 4
  • Text Kit學習(入門和進階): http://www.cocoachina.com/industry/201...
    F麥子閱讀 4,137評論 1 13
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,497評論 0 17
  • 車站的警衛們聞聲趕來,在這大熱天尤其又是在中午,本該誰午覺的時間又遇上了搶劫事件,這似乎是他們沒有料想到的。這個...
    輕將紅袖挽閱讀 194評論 0 0
  • CocoaPods的安裝與使用(-)發布自己的pods到CocoaPods trunk 簡介 CocoaPods ...
    北京的天空閱讀 286評論 0 0