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