UITextView和UILabel高度计算不正确

之前写了一篇《UITextView高度计算不正确》的文章,但是还不够完善。

可能有的同学觉得没什么问题六,那我们看代码。


NSString *textStr = @"UITextView和UILabel高度计算不正确";

UIFont *font = [UIFont systemFontOfSize:16];

UILabel *testLabel = [[UILabel alloc] init];

testLabel.font = font;

testLabel.text = textStr;

CGSize size = [testLabel sizeThatFits:CGSizeMake(300, 30)];

NSLog(@"size = %@", NSStringFromCGSize(size));

CGSize size1 = [textStr sizeWithAttributes:@{NSFontAttributeName : font}];

NSLog(@"size1 = %@", NSStringFromCGSize(size1));

CGRect rect = [textStr boundingRectWithSize:CGSizeMake(300, MAXFLOAT)

options:NSStringDrawingUsesFontLeading |NSStringDrawingUsesLineFragmentOrigin

attributes:@{NSFontAttributeName : font}

context:nil];

NSLog(@"size2 = %@", NSStringFromCGSize(rect.size));


size 是根据label的高度计算出的高度,也是界面显示UI的实际高度。

size1和size2 是更具label的text计算出的高度,也就是字符串的高度。

输出结果(图一):

图一

我们看到 根据label的text计算出来的高度 和UILabel实际显示的高度是有区别的。

UI textView你也可以试一下,结果一样。

这种情况,少数UI布局或许看不出来有什么不妥的地方。但当你的cell中UILabel或者UITextView使用较多的时候,而且是Auto Layout,返回高度需要计算,或者debug view hierarchy,就会发现这个问题。

设置字体UIFont *font = [UIFont systemFontOfSize:20];

输出结果(图二):

图二

发现如果根据text计算的高度取小数值小于0.5,则保留一位小数为0.5,若大于0.5则向后取整。

解决办法:ceilf(size1.height * 2.0f) / 2.0f,通过这个方法可以得到与view实际显示的高度。

我们输出一下处理后的高度(图三):

NSLog(@"size1_H = %@", @(ceilf(size1.height * 2.0f) / 2.0f));

NSLog(@"size2_H = %@", @(ceilf(rect.size.height * 2.0f) / 2.0f));

图三

完全吻合。

严谨没有错,遇到问题不要回避,答案就在眼前。

推荐阅读更多精彩内容