天天看点

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框架的主要工作原理,文字渲染,图文混排的更多内容,后面博客会继续探讨。有疏漏之处,共同讨论进步。