根据NSString字符串长度自动改变UILabel的frame

  相信大家都遇到过这种需求。如果一个不慎,容易做成这个模样:

  话不多说,上代码。

  

  1.首先,设置UILabel的相关属性

1    UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 200, [UIScreen mainScreen].bounds.size.width - 20, 20)];
2     [tmpLabel setNumberOfLines:0];
3     [self.view addSubview:tmpLabel];

  就这些?就这些。只需要初始化,只需要设置行数为0,也就是行数无上限(自动换行)就可以添加到父视图上了。其他的UILabel的属性你想设置就设置,不想设置就设置上面这些就可以。

  2.根据字符串NSString获得UILabel的frame

    2.1 UILabel宽度不变,改变高度

1     //宽度不变,根据字的多少计算label的高度
2     NSString *str = @"可以更改此内容进行测试,宽度不变,高度根据内容自动调节";
3     CGSize size = [str sizeWithFont:tmpLabel.font constrainedToSize:CGSizeMake(tmpLabel.frame.size.width, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
4     //根据计算结果重新设置UILabel的尺寸
5     [tmpLabel setFrame:CGRectMake(tmpLabel.frame.origin.x,tmpLabel.frame.origin.y, size.height, size.height)]; 
6    [tmpLabel setText:str];

  使用sizeWithFont方法来获得CGSize。其中,宽度我们设置为我们UILabel的width;高度设置为MAXFLOAT,一个宏,代表CGFloat最大值;lineBreakMode设置为NSLineBreakByWordWrapping。这样就可以设置UILabel宽度不变,高度根据NSString改变了。

    2.2 UILabel高度不变,改变宽度

1   //高度固定不折行,根据字的多少计算label的宽度  
2   NSString *str = @"高度不变获取宽度,获取字符串不折行单行显示时所需要的长度";  
3   CGSize size = [str sizeWithFont:label.font constrainedToSize:CGSizeMake(MAXFLOAT, label.frame.size.height)]; 
4   //根据计算结果重新设置UILabel的尺寸 5   [label setFrame:CGRectMake(tmpLabel.frame.origin.x,tmpLabel.frame.origin.y, size.width, size.height)];
6   label.text = str;

  同样的设置。唯一的不同在于我们不需要设置折行模式了。这样就设置成为UILabel高度不变,改变宽度了。

  3.如果是iOS7.0之后,它会提示你sizeWithFit这个方法被废弃了。提示我们使用下面的方法替代:

1   //宽度不变,根据字的多少计算label的高度
2   NSString *str = @"可以更改此内容进行测试,宽度不变,高度根据内容自动调节";
3   CGSize textSize = [str boundingRectWithSize:CGSizeMake(tmpLabel.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:tmpLabel.font} context:nil].size;    

  改为boundingRectWithSize这个方法来改变字符串长度。通过更改options的参数NSStringDrawingOptions来决定是高固定改变宽度还是宽固定改变高度。

原文地址:https://www.cnblogs.com/SoulKai/p/5972779.html