之前写了一篇《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));
完全吻合。
严谨没有错,遇到问题不要回避,答案就在眼前。