美文网首页iOS Developer - Mixed Image And TextUILabel集合小知识点
iOS中求出label中文字的行数和每一行的内容

iOS中求出label中文字的行数和每一行的内容

作者: 黑黑的小土豆 | 来源:发表于2016-08-11 22:39 被阅读4502次

    今天遇到一个需求,需要计算label中文字的行数。想了好久也没想到好的解决方法,就在网上找了下。结果发现一篇文章是讲这个的。这部分代码不但能够求出一个label中文字行数,更厉害的是能够求出每一行的内容是什么; 代码如下。

    - (NSArray *)getLinesArrayOfStringInLabel:(UILabel *)label{
        NSString *text = [label text];
        UIFont *font = [label font];
        CGRect rect = [label frame];
        
        CTFontRef myFont = CTFontCreateWithName(( CFStringRef)([font fontName]), [font pointSize], NULL);
        NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
        [attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge  id)myFont range:NSMakeRange(0, attStr.length)];
        CFRelease(myFont);
        CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString(( CFAttributedStringRef)attStr);
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
        CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
        NSArray *lines = ( NSArray *)CTFrameGetLines(frame);
        NSMutableArray *linesArray = [[NSMutableArray alloc]init];
        for (id line in lines) {
            CTLineRef lineRef = (__bridge  CTLineRef )line;
            CFRange lineRange = CTLineGetStringRange(lineRef);
            NSRange range = NSMakeRange(lineRange.location, lineRange.length);
            NSString *lineString = [text substringWithRange:range];
            CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr, lineRange, kCTKernAttributeName, (CFTypeRef)([NSNumber numberWithFloat:0.0]));
            CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr, lineRange, kCTKernAttributeName, (CFTypeRef)([NSNumber numberWithInt:0.0]));
            //NSLog(@"''''''''''''''''''%@",lineString);
            [linesArray addObject:lineString];
        }
        
        CGPathRelease(path);
        CFRelease( frame );
        CFRelease(frameSetter);
        return (NSArray *)linesArray;
    }
    

    文章参照 链接
    函数返回的数组的count 即为label中文字行数 ;数组中元素即为某行内容。

    转载请注明出处:
    原文地址:http://mingxianwei.github.io/2016/05/27/iOS中求出label中文字的行数和每一行的内容
    作者:小土豆

    相关文章

      网友评论

      • 86f8d8645bec:计算有偏差
      • 东健FO_OF:有个地方不明白,下面这行代码为什么要写两次?
        CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr, lineRange, kCTKernAttributeName, (CFTypeRef)([NSNumber numberWithInt:0.0]));
      • CoderFarmer:如果label上显示的是attributeText 完全错了每个字算一行了 碰到字母或者数字 也会不准确...
        b61963400a6d:如果文字里面有空格,就不准确了哦。每行取的内容不对
        黑黑的小土豆:这个函数 确实不能使用与富文本。富文本可以在显示时控制文字的显示的字体大小,和宽度间隔。而这个函数 只取得label 的字体大小来计算的。有一定额局限性。
      • 微步毂纹生:调用崩溃了,崩在了NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];这行 报错 libc++abi.dylib: terminate_handler unexpectedly threw an exception
        黑黑的小土豆:跟踪调试一下 看看一下你的这个text 是什么内容
      • 惊鸿独舞:精彩赏学,问问祝福👍👍👍☕☕
      • 40b44fa7625e:复制进去就报错。没有文档介绍
        微步毂纹生:需要引入#import <CoreText/CoreText.h>头文件
        黑黑的小土豆:@Co骚年 呵呵 估计是没有引入头文件
      • 鬼丶白:有没有准确计算中文和英文的啊
        黑黑的小土豆:@soime 不知道你是怎么计算的 以上代码可以计算指定的label的文字行数以及每行内容 你说的计算文字不准确实要根据内容计算label的大小么?
        鬼丶白:@黑黑的小土豆 我们做邻居圈 用户的评论是随机的有些随意打一些字母就会导致计算不准确
        黑黑的小土豆:@soime 这儿不能解决你的需求么?

      本文标题:iOS中求出label中文字的行数和每一行的内容

      本文链接:https://www.haomeiwen.com/subject/mopssttx.html