有关UILabel那些你可能不知道的事儿

今天在文中主要要说2个问题,其一有关label多行显示被截断的省略号显示问题,其二有关label的2种计算问题.

(1)首先上一张图:


设置一个简单的截断方式,代码如下

    UILabel *demoLabel = [UILabel new];
    demoLabel.numberOfLines = 2;
    demoLabel.backgroundColor = [UIColor lightGrayColor];
    demoLabel.lineBreakMode = NSLineBreakByTruncatingTail;
    [self.view addSubview:demoLabel];
    
    demoLabel.text = @"逗比世界:只是因为在人群中多看了你一眼,再也没能忘掉你容颜.梦想着偶然能有一天再相见,从此我开始孤单地思念.";
    //下面的是这个label的自动布局,本文下面的代码不再重复粘贴这些代码
    demoLabel.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-80-[demoLabel(>=0)]"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings(demoLabel)]];
    
    
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[demoLabel]-(>=15)-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings(demoLabel)]];

上面的截断方式是最基本的,但是今天我要说的是下面的,请看图


在上方的图片中设置了各段字体的颜色,大小,行间距,但是写过这样label同学会发现为什么自己的省略号不显示,而我的却显示呢,而且自己明明想第一个例子一样设置了,可就是不显示,我想说的是你设置了没错,但是设置的位置不对,请看代码:

    UILabel *demoLabel = [UILabel new];
    demoLabel.numberOfLines = 2;
    demoLabel.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:demoLabel];
    
    NSString *labelString = @"逗比世界:只是因为在人群中多看了你一眼,再也没能忘掉你容颜.梦想着偶然能有一天再相见,从此我开始孤单地思念.";
    NSMutableAttributedString *tempString = [[NSMutableAttributedString alloc]initWithString:labelString];
    [tempString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 5)];
    NSRange centerRange = [labelString rangeOfString:@"只是因为在人群中多看了你一眼,再也没能忘掉你容颜."];
    [tempString addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:centerRange];
    [tempString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12] range:NSMakeRange(0, tempString.length)];
    

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
    paragraphStyle.lineSpacing = 5;//行间距为5
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;//在这里设置省略号格式
    [tempString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, tempString.length)];
    demoLabel.attributedText = tempString;

(2)第二个问题是有关label的高度计算问题

分2类,一类是普通的label的计算,这种计算方案适用于普通的label,也就是未使用NSMutableArreibutedString的label,如

    NSString *labelString = @"逗比世界:只是因为在人群中多看了你一眼,再也没能忘掉你容颜.梦想着偶然能有一天再相见,从此我开始孤单地思念.";
    float width = [UIScreen mainScreen].bounds.size.width;
    CGRect recentRect = [labelString boundingRectWithSize:CGSizeMake(width-30, 5000)
                                          options: NSStringDrawingTruncatesLastVisibleLine |    NSStringDrawingUsesLineFragmentOrigin  |NSStringDrawingUsesFontLeading
                                       attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]}
                                          context:nil];
第二类是使用了复杂样式的label,如第一个问题的第二张图那样的情况,我们在使用
    NSMutableAttributedString *tempString = [[NSMutableAttributedString alloc]initWithString:labelString];
    [tempString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 5)];
    NSRange centerRange = [labelString rangeOfString:@"只是因为在人群中多看了你一眼,再也没能忘掉你容颜."];
    [tempString addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:centerRange];
    [tempString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12] range:NSMakeRange(0, tempString.length)];
    

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
    paragraphStyle.lineSpacing = 5;//行间距为5
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;//在这里设置省略号格式
    [tempString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, tempString.length)];


    
    CGRect tempRect = [tempString boundingRectWithSize:CGSizeMake(width-30, 5000)
                                               options: NSStringDrawingTruncatesLastVisibleLine |    NSStringDrawingUsesLineFragmentOrigin  |NSStringDrawingUsesFontLeading
                                               context:nil];
计算时一直会出现计算不准确的现象,我做了多次试验也是这样,他只能计算出来一行的高度,其实想要解决这种问题,我们只需要改变一下某行代码的位置就可以了.

[paragraphStyle.lineBreakMode =NSLineBreakByTruncatingTail;//在这里设置省略号格式] 没错就是这行代码,只要我们在计算之前添加它了,系统就会变成单行的高度,所以,我们只需要将他放到计算完高度的后面就可以了,示例代码:

    NSString *labelString = @"逗比世界:只是因为在人群中多看了你一眼,再也没能忘掉你容颜.梦想着偶然能有一天再相见,从此我开始孤单地思念.";
    NSMutableAttributedString *tempString = [[NSMutableAttributedString alloc]initWithString:labelString];
    [tempString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 5)];
    NSRange centerRange = [labelString rangeOfString:@"只是因为在人群中多看了你一眼,再也没能忘掉你容颜."];
    [tempString addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:centerRange];
    [tempString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12] range:NSMakeRange(0, tempString.length)];
    

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
    paragraphStyle.lineSpacing = 5;//行间距为5
    [tempString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, tempString.length)];


    
    CGRect tempRect = [tempString boundingRectWithSize:CGSizeMake(width-30, 5000)
                                               options: NSStringDrawingTruncatesLastVisibleLine |    NSStringDrawingUsesLineFragmentOrigin  |NSStringDrawingUsesFontLeading
                                               context:nil];
    
    NSLog(@"计算高度:%@",NSStringFromCGRect(tempRect));
    
//    必须在计算完高度再设置,否则会出现文字上移的现象
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
因为你计算高度的时候是不需要考虑文字结尾是什么样式的问题,所以我们可以将设置省略号结尾放到计算后面.

上面只是我的一些小理解,希望可以对大家有一点小的帮助,3Q.



发布了10 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a892445213/article/details/49867643