在做小说阅读器时,每章节的内容有很多文字,如果我们直接把章节的内容显示出来用户体验肯定不好,为此需要我们把章节内容分成几页去显示,每页的文字正好铺满我们设定的区域。
下面的代码是用CoreText做的分页计算:
NSMutableAttributedString *str = [[NSMutableAttributedString alloc]initWithString:_contentText];
[str addAttributes:[self attributesWithFont:_contentFont] range:NSMakeRange(0, str.length)];
CFAttributedStringRef cfAttStr = (__bridge CFAttributedStringRef)str;
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(cfAttStr);
int textPos = 0;
NSInteger totalPage = 0;
NSUInteger strLength = [str length];
while (textPos < strLength) {
//设置路径
CGPathRef path = CGPathCreateWithRect(CGRectMake(0, 0, _textRenderSize.width, _textRenderSize.height), NULL);
//生成frame
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(textPos, 0), path, NULL);
//获取范围并转换为NSRange
CFRange frameRange = CTFrameGetVisibleStringRange(frame);
NSRange range = NSMakeRange(frameRange.location, frameRange.length);
//以NSString形式保存
[array addObject:NSStringFromRange(range)];
//移动当前文本位置
textPos += frameRange.length;
CFRelease(frame);
CGPathRelease(path);
totalPage++;
//释放路径和frame,页数加1
}
CFRelease(framesetter);
代码中只设置了文本的字号。
简易小说阅读器这是我没事的时候写的,当然还没写完,如果你有兴趣也可以加入进来。
网友评论