天天看點

iOS文本布局探讨之一——文本布局架構TextKit淺析(二)

五、關于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架構的主要工作原理,文字渲染,圖文混排的更多内容,後面部落格會繼續探讨。有疏漏之處,共同讨論進步。