iOS布局中,常常要计算UILabel的宽高,自动约束布局至今还用不熟,先把代码计算宽高的记一下:
一般这样几种需求:
1、给定字符串,限定label的宽高,自动调整label的font
1 2 3 4 5 6 |
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框
1 2 3 4 5 6 7 |
UILabel * label2 = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 50, 30)]; label2.text = @"随便打几个字试试"; // label2.numberOfLines = 0; [label2 sizeToFit]; //这里分两种情况,如果未设置numberOfLines = 0,则会自动调整label宽高; //否则,会动态变化高度,宽度维持设置的宽度,变成多行 //这种设置时,如果设置的frame大于字符串的占用,label的frame会自动收紧 |
3、计算字符串宽高
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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过宽。
一般来说,显示固定的标签,用第二种就够了。