这是我的工作代码段:
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中使用此代码段,并将“ height”添加到NSNumbers数组中,并且得到默认textLabel的正确单元格高度。
如果要在textLabel中的文本下留出更多空间,请再增加4个像素。
****更新****
我不同意“ 40px的宽度错误”,我大喊是缺少高度的4px,因为4px是字母和单行边界之间的默认默认高度。您可以使用UILabel进行检查,如果字体大小为16,则需要UILabel高度为20。
但是,如果您的最后一行没有“ g”或其中的任何内容,则该度量可能会错过4px的高度。
我用一种小方法重新检查了一下,我的标签的准确高度为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);
}
除了4px主题:根据您使用的字体和字体粗细,该计算还返回不同的高度值。在我的情况下:字体大小为16.0的HelveticaNeue-Medium对一行返回20.0的行高,对两行返回39.0,对四行返回78px->每行缺少1px-从第2行开始-但您想要要使每行的fontsize + 4px行距都必须得到一个高度结果。
编码时请记住这一点!
我没有针对此“问题”的功能,但完成后我将更新此帖子。