根据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来决定是高固定改变宽度还是宽固定改变高度。