这是我的工作代码片段:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];
NSString *headline = [dict objectForKey:@"title"];
UIFont *font = [UIFont boldSystemFontOfSize:18];
CGRect rect = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
CGFloat height = roundf(rect.size.height +4)
我在计算的高度上加了 4px,因为没有这 4px,就少了一行。
我在 tableView 中使用此代码片段并将“高度”添加到 NSNumbers 数组中,我得到了默认 textLabel 的正确单元格高度。
如果您希望 textLabel 中的文本下方有更多空间,请再添加 4 个像素。
**** 更新 ****
我不同意“40px 的宽度错误”,我喊是缺少高度的 4px,因为 4px 是字母和单行边界之间的空格的默认高度。您可以使用 UILabel 检查它,对于 16 的字体大小,您需要 20 的 UILabel 高度。
但是,如果您的最后一行没有“g”或其他任何内容,则测量可能会错过 4px 的高度。
我用一种小方法重新检查了它,我的标签得到了 20,40 或 60 的准确高度和小于 300 像素的正确宽度。
要支持iOS6和iOS7,可以使用我的方法:
- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (iosVersion >= 7.0) {
rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
}
NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
return rect.size.height;
}
**** 升级 ****
感谢您的评论,我按照以下方式升级了我的功能。由于 sizeWithFont 已弃用,并且您将在 XCode 中收到警告,因此我添加了 diagnostic-pragma-code 以删除此特定函数调用/代码块的警告。
- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
}
return ceil(rect.size.height);
}
除了 4px 主题:根据您使用的字体和字体粗细,计算返回不同的高度值。在我的情况下:字体大小为 16.0 的 HelveticaNeue-Medium 返回单行的行高 20.0,但两行返回 39.0,4 行返回 78px -> 每行缺少 1px - 从第 2 行开始 - 但你想要为每一行设置你的字体大小 + 4px 行空间,你必须得到一个高度结果。
编码时请记住这一点!
我还没有解决这个“问题”的功能,但我会在完成后更新这篇文章。