iOS布局中,常常要计算UILabel的宽高,自动约束布局至今还用不熟,先把代码计算宽高的记一下:
一般这样几种需求:
1、给定字符串,限定label的宽高,自动调整label的font
UILabel * label1 = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 50, 30)];
label1.text = @"随便打几个字试试";
label1.numberOfLines = 0; //不设置时,默认是一行
label1.adjustsFontSizeToFitWidth = YES;
//当未设置numberOfLines时,会压缩字体大小,在限定的宽度一行内显示完所有文字
//设置numberOfLines=0后,如果label控件能容纳下原始大小的全部文字,就会拆成多行显示;否则会压缩字体大小
2、给定字符串,限定label字体大小,自动调整label框
UILabel * label2 = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 50, 30)];
label2.text = @"随便打几个字试试";
// label2.numberOfLines = 0;
[label2 sizeToFit];
//这里分两种情况,如果未设置numberOfLines = 0,则会自动调整label宽高;
//否则,会动态变化高度,宽度维持设置的宽度,变成多行
//这种设置时,如果设置的frame大于字符串的占用,label的frame会自动收紧
3、计算字符串宽高
UILabel * label3 = [[UILabel alloc]initWithFrame:CGRectMake(0, 300, 300, 100)];
label3.text = @"我来是撒好滴撒hi多少我安徽的覅USD和是的撒";
label3.numberOfLines = 0;
CGSize size = [self sizeWithString:label3.text font:label3.font maxSize:CGSizeMake(label3.frame.size.width, 300)];
label3.bounds = CGRectMake(0, 0, size.width, size.height);
label3.frame = CGRectMake(label3.frame.origin.x, label3.frame.origin.y, size.width, size.height) ;
- (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize {
NSDictionary *dict = @{NSFontAttributeName : font};
// 如果计算出的文字范围超出了指定的范围,返回的就是指定的范围
// 如果计算出的文字范围小于指定的范围, 返回的就是真实的范围
CGSize size = [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
return size;
}
//这种计算宽高,按需要设置numberOfLines;如果想计算高度,那肯定要设置numberOfLines=0的嘛;
总结:这三种计算都要注意numberOfLines的设置,单行的label要防止frame过宽。
一般来说,显示固定的标签,用第二种就够了。

支付宝打赏
微信打赏