iOS CoreText计算每页显示的字数的方法

在做小说阅读器时,每章节的内容有很多文字,如果我们直接把章节的内容显示出来用户体验肯定不好,为此需要我们把章节内容分成几页去显示,每页的文字正好铺满我们设定的区域。
下面的代码是用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);

代码中只设置了文本的字号。

简易小说阅读器

https://www.cnblogs.com/XYQ-208910/p/6222931.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在做小说阅读器时,每章节的内容有很多文字,如果我们直接把章节的内容显示出来用户体验肯定不好,为此需要我们把章节内容...
    泽i阅读 2,047评论 5 6
  • (1) 一起游学的同学中有男生就是好,他早早的就把椅子搬到了看海高台上,让我们第二天的课前分享在一个观海台上...
    海洋奇缘阅读 258评论 0 1
  • 新的一天开始了,人们忙碌中奔走。 天空中挥洒着霾雨,今天没带伞,看过天气预报知道今天会下雨,以为不会在上班路上下雨...
    杨继昌心理咨询师阅读 242评论 0 0
  • 我们会花很长的时间思考“我的梦想是什么”“我活着是为了什么”“生活的意义是什么”之类的问题。我们有些茫然,不知道哪...
    冬青一内蒙阅读 373评论 0 2
  • 故事写了十几篇,我也提到过不少民间传说中的神仙,但是在我文中出现的神仙大部分是地府机关单位的,像孟婆、阎王爷、黑白...
    蝉鸣三境阅读 1,497评论 0 0

友情链接更多精彩内容