限定UIlabel宽高计算能装下多少文字(笔记)

//根据指定的大小,对字符串进行分页,计算出每页显示的字符串区间(NSRange)

    - (NSArray *)pageRangeArrayWithConstrainedToSize:       (CGSize)size
    {
    NSAttributedString *attributedString = self;
NSMutableArray * resultRange = [NSMutableArray array];
CGRect rect = CGRectMake(0, 0, size.width, size.height);

//    以下方法耗时 基本再 0.5s 以内
// NSDate * date = [NSDate date];
NSInteger rangeIndex = 0;//剩余的字数
do {
    NSUInteger length = MIN(600, attributedString.length - rangeIndex);
    NSAttributedString * childString = [attributedString attributedSubstringFromRange:NSMakeRange(rangeIndex, length)];
    CTFramesetterRef childFramesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) childString);
    UIBezierPath * bezierPath = [UIBezierPath bezierPathWithRect:rect];
    CTFrameRef frame = CTFramesetterCreateFrame(childFramesetter, CFRangeMake(0, 0), bezierPath.CGPath, NULL);
    
    CFRange range = CTFrameGetVisibleStringRange(frame);
    NSRange r = {rangeIndex, range.length};
    if (r.length > 0) {
        [resultRange addObject:[NSValue valueWithRange:r]];
    }
    rangeIndex += r.length;
    CFRelease(frame);
    CFRelease(childFramesetter);
} while (rangeIndex < attributedString.length && attributedString.length > 0);
//NSTimeInterval millionSecond = [[NSDate date] timeIntervalSinceDate:date];
//NSLog(@"耗时 %lf", millionSecond);
return resultRange;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 测试最重要的是测试思路、测试策略和测试计划,只有这些前期工作做足,后面的测试执行才能针对整体的产品测试起到事半功倍...
    雷哥说阅读 1,501评论 0 8
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,739评论 18 399
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,203评论 2 33
  • 不知道我对《你的名字。》包含了什么样的情感,想起泷和三叶相互追寻的时候,心里会有一种窒息的感觉,可能这就是揪心吧。...
    安臻_L阅读 245评论 0 0
  • 早上5点半,宝宝忽然醒了,迷迷糊糊中将她揽到怀里,她像小猫一样蜷缩在一起,又接着睡着了。可是,怎么宝宝的头这么烫,...
    827943a9c996阅读 195评论 0 0