这是我的工作代码片段:
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)
我将计算出的高度增加了4个像素,因为如果没有这4个像素,会少一行。
我在tableView中使用这段代码,并将“height”添加到NSNumber数组中,可以得到默认textLabel的正确单元格高度。
如果您想在textLabel下方获得更多的空间,请再添加4个像素。
**** 更新 ****
我不同意“宽度40像素的错误”,应该是缺失高度的4个像素,因为4个像素是单行字母与边界之间的默认高度。
您可以通过一个UILabel进行检查,对于字体大小为16,需要UILabel高度为20。
但是,如果您的最后一行没有“g”或其他字符,测量可能会缺少4个像素的高度。
我用一个小方法重新检查了一下,我的标签可以准确地获得20、40或60的高度和小于300px的正确宽度。
为了支持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中会得到警告,因此我添加了诊断-预处理器指令来消除这个特定函数调用/代码块的警告。
- (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);
}
除了4像素的话题之外:
根据您使用的字体和字重,计算返回不同的高度值。在我的情况下:HelveticaNeue-Medium字体,字号为16.0,在单行中返回20.0的行高,但在两行中返回39.0,在4行时为78px-->每行缺少1像素-从第2行开始-但是如果要让您的字体大小+ 4px的行距作用于每一行,则必须获得一个高度结果。
编码时请记住这一点!
我还没有针对这个“问题”的函数,但完成后我会更新此帖子。