五、關于NSLayoutManager
顧名思義,NSLayoutManager專門負責對文本的布局渲染,簡單了解,其從NSTextStorage從拿去展示的内容,将去處理後布局到NSTextContainer中。
NSLayoutManager與NSTextContainer的關系為一對多,放入NSLayoutManager中的NSTextContainer會以有序數組的形式進行管理,在内容布局時,超出第一個NSTextContainer的内容會被布局到後一個NSTextContainer中。
NSLayoutManager中有關NSTextContainer操作的方法如下:
//container數組
@property(readonly, NS_NONATOMIC_IOSONLY) NSArray<NSTextContainer *> *textContainers;
//添加一個container
- (void)addTextContainer:(NSTextContainer *)container;
//在指定位置插入一個container
- (void)insertTextContainer:(NSTextContainer *)container atIndex:(NSUInteger)index;
//删除一個指定的container
- (void)removeTextContainerAtIndex:(NSUInteger)index;
//注意 這個方法不需要顯式的調用 當布局Container發生變化時 系統會自動調用
- (void)textContainerChangedGeometry:(NSTextContainer *)container;
與布局管理相關的屬性與方法如下:
//是否顯示隐形的符号
/*
預設為NO,如果設定為YES,則會将空格等隐形字元顯示出來
*/
@property(NS_NONATOMIC_IOSONLY) BOOL showsInvisibleCharacters;
//是否顯示某些布局控制字元
@property(NS_NONATOMIC_IOSONLY) BOOL showsControlCharacters;
//這個屬性可以用于設定斷字
這個屬性的取值為0到1之間 預設為0 即單詞換行時從來不會中斷 越接近1 則使用連字元進行單詞換行中斷的機率越大
@property(NS_NONATOMIC_IOSONLY) CGFloat hyphenationFactor;
//是否使用字型定義的行距
預設使用字型所定義的行距資訊 通過設定這個屬性為NO可以關閉此功能
@property(NS_NONATOMIC_IOSONLY) BOOL usesFontLeading;
//這個屬性設定是否允許對相鄰位置的内容進行布局 預設為YES,設定為NO後将可以提供大文本布局的效率
@property(NS_NONATOMIC_IOSONLY) BOOL allowsNonContiguousLayout;
//下面這幾個方法用于移除某一範圍内的布局
- (void)invalidateGlyphsForCharacterRange:(NSRange)charRange changeInLength:(NSInteger)delta actualCharacterRange:(nullable NSRangePointer)actualCharRange;
- (void)invalidateLayoutForCharacterRange:(NSRange)charRange actualCharacterRange:(nullable NSRangePointer)actualCharRange NS_AVAILABLE(10_5, 7_0);
- (void)invalidateDisplayForCharacterRange:(NSRange)charRange;
- (void)invalidateDisplayForGlyphRange:(NSRange)glyphRange;
六、文本内容類NSTextStorage
NSTextStorage實際上是繼承自NSMutableAttributedString。NSAttributedString是一種自帶屬性的字元串類,關于NSAttributedString的基本用法,如下部落格中有介紹:
http://my.oschina.net/u/2340880/blog/397500。
TextKit架構中在對文本進行布局時,主要關注于3個方面:
1.字元的屬性,例如顔色,字型等。
2.行與段落的屬性,如縮進,行間距等。
3.文檔屬性,包括四周邊距、文檔尺寸等。
這些都由NSAttributedString來進行定義。
如上所介紹的是TextKit架構的主要工作原理,文字渲染,圖文混排的更多内容,後面部落格會繼續探讨。有疏漏之處,共同讨論進步。