有段時間沒寫文章了,主要簡單的東西不想寫,復雜的東西不會寫。所以寫的就慢慢變少了,不過最近在研究CoreText略有心得,這里做些分享。
想真的看懂YYLabel,做到各個功能模塊的增刪改查皆都隨心而行是要有一定心理準備的。
這里有幾篇搜集到的文章需要先看明白
排名無先后。
還有兩個練手的Demo,從簡單到復雜,需要先做出來看明白。
排名有先后
這個是我自己仿寫TYAttributedLabel做出來的,只是還有點瑕疵,諸位有興趣可以看看 ADAttributedLabel
總結
NSTextStorage 是一個中樞,它管理所有的文本和屬性信息。系統只提供了兩個存取器方法存取它們,并另外提供了兩個方法來分別修改文本和屬性。
NSTextStorage 是從它的父類 NSAttributedString 繼承了這些方法。
NSTextStorage 從文本系統看來 僅僅是一個帶有屬性的字符串,附帶一些擴展。這兩者唯一的重大不同點是 NSTextStorage 包含了一個方法,可以把所有對其內容進行的修改以通知的形式發送出來。processEditing在layout manager中文本修改時發送通知,它通常也是處理一些文本修改邏輯的好地方
NSTextContainer:每個 Text View 定義了一個文本可以繪制的區域。為此,每個 Text View 都有一個 Text Container,它精確地描述了這個可用的區域。并且不接受任何超出的文本
NSLayoutManager
Layout Manager 是中心組件,它把所有組件粘合在一起
- 這個管理器監聽 Text Storage 中文本或屬性改變的通知,一旦接收到通知就觸發布局進程。
- 從 Text Storage 提供的文本開始,它將所有的字符翻譯為字形
- 一旦字形全部生成,這個管理器向它的 Text Containers 查詢文本可用以繪制的區域。
- 然后這些區域被行逐步填充,而行又被字形逐步填充。一旦一行填充完畢,下一行開始填充。
- 對于每一行,布局管理器必須考慮斷行行為(放不下的單詞必須移到下一行)、連字符、內聯的圖像附件等等。
- 當布局完成,文本的當前顯示狀態被設為無效,然后 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)}
最后:開發不易,大家共勉。