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

时间:2023-03-08 17:02:47

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

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

  话不多说,上代码。

  

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

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

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

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

    2.1 UILabel宽度不变,改变高度

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

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

    2.2 UILabel高度不变,改变宽度

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

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

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

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

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