TextKit 实现文本分页

1,824 阅读1分钟

TextKit的一些介绍在这里就不多说了,相关的信息可以看这里。这篇文章主要讲文本分页和遇到的问题。 TextKit中主要涉及的就三个类,实现分页也用到这是三个。

NSTextStorage                
NSLayoutManager            
NSTextContainer              

主要的思路就是:

  1. NSTextStorage 存储要分段的文本信息
  2. NSTextStorage 设置 NSLayoutManager
  3. 在NSLayoutManager 中添加 NSTextContainer
  4. 获取NSTextContainer 显示的文本长度
  5. 返回分段信息
//TextKit 分页
+ (NSArray *)pagingwithContentString:(NSString *)contentString contentSize:(CGSize)contentSize textAttribute:(NSDictionary *)textAttribute {
    NSMutableArray *pagingArray = [NSMutableArray array];
    NSMutableAttributedString *orginAttString = [[NSMutableAttributedString alloc] initWithString:contentString attributes:textAttribute];
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:orginAttString];
    
    NSLayoutManager* layoutManager = [[NSLayoutManager alloc] init];
    
    [textStorage addLayoutManager:layoutManager];
    
    while (YES) {
        NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:contentSize];
        [layoutManager addTextContainer:textContainer];

        NSRange rang = [layoutManager glyphRangeForTextContainer:textContainer];
        if (rang.length <= 0) {
            break;
        }
        
        NSAttributedString *attStr =[textStorage attributedSubstringFromRange:rang];
        
        [pagingArray addObject:attStr];
    }
    return pagingArray;
}

注意
由于系统的部分字体不支持中文,textAttribute 中指定的字体类型有可能跟输出内容的字体不一致,具体可以看Demo效果。

支持中文的系统字体

Heiti SC              黑体-简
Heiti TC              黑体-繁
PingFang TC           平方-简
PingFang HK           平方-繁
PingFang SC           平方-繁

简单的demo:demo地址