iOS阅读器实践系列(二)多页排版

当内容太多,一页显示不下时,就需要显示多页,本篇就介绍多页显示。

这里的一页我们可以理解为一个视图,即这里我们需要多个视图来显示排版内容。在简单情况下,我们可在一个视图中绘制一个CTFrame(当然一个视图中可以绘制多个CTFrame)。那么问题转化为我们的内容字符串需要生成多个CTFrame,从而绘制到多个视图上。

// 创建 CTFramesetterRef 实例
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabStr);
    
    NSMutableArray *frames = [[NSMutableArray alloc] init];
    int textPos = 0;
    while (textPos < mabStr.length)
    {   
        CTFrameRef frame = [self createFrameWithFramesetter:framesetter frameWidth:frameWidth stringRange:CFRangeMake(textPos, 0) orginY:OriginY height:frameHeight];
        
        CFRange frameRange = CTFrameGetVisibleStringRange(frame);
        
        CoreTextData *data = [[CoreTextData alloc] init];        
        [frames addObject:frame];
        
        textPos += frameRange.length;
        
        // 释放内存
        CFRelease(frame);
    }
    
    // 释放内存
    CFRelease(framesetter);

代码有点简略,这里的主要内容就是while循环,主要思想是每次循环都从上次循环已排版到的字符的下一个字符开始到这次一共能显示下的字符为止,这个范围内的字符来生成用于本页显示的CTFrame,直到取完为止。

原文地址:https://www.cnblogs.com/summer-blog/p/6030885.html