Ios 为什么UITableViewCell的高度小于其文本的高度?

Ios 为什么UITableViewCell的高度小于其文本的高度?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个UITableView和UITableView单元格s,我在函数heightForRowAtIndexPath中以休闲方式设置每个单元格的高度: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:in

我有一个
UITableView
UITableView单元格
s,我在函数
heightForRowAtIndexPath
中以休闲方式设置每个单元格的高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    NSStringDrawingOptions opts = (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading);
    CGSize boundingRect = CGSizeMake(450.f, CGFLOAT_MAX);
    CGSize size = [cell.detailTextLabel.text boundingRectWithSize:boundingRect
                                                      options:opts
                                                   attributes:[cell.detailTextLabel.attributedText attributesAtIndex:0 effectiveRange:nil]
                                                      context:nil].size;
    CGFloat height = size.height;
    size = [cell.textLabel.text boundingRectWithSize:boundingRect
                                         options:opts
                                      attributes:[cell.textLabel.attributedText attributesAtIndex:0 effectiveRange:nil]
                                         context:nil].size;
    height += size.height;
    return height;
}
NSString *nickName = @"some nickname"; // gets the nickname
NSString title = [NSString stringWithFormat:@"%@ wrote:", nickName];
NSString *detail = @"some text"; // gets the content of the message

[cell.textLabel setText: title];
[cell.detailTextLabel setText: detail];
cell.detailTextLabel.numberOfLines = 0;
cell.detailTextLabel.lineBreakMode = NSLineBreakByWordWrapping;
但是我得到的单元格对于文本来说太小了,较长的文本不适合:

在单元格中写入的文本按以下方式设置:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    NSStringDrawingOptions opts = (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading);
    CGSize boundingRect = CGSizeMake(450.f, CGFLOAT_MAX);
    CGSize size = [cell.detailTextLabel.text boundingRectWithSize:boundingRect
                                                      options:opts
                                                   attributes:[cell.detailTextLabel.attributedText attributesAtIndex:0 effectiveRange:nil]
                                                      context:nil].size;
    CGFloat height = size.height;
    size = [cell.textLabel.text boundingRectWithSize:boundingRect
                                         options:opts
                                      attributes:[cell.textLabel.attributedText attributesAtIndex:0 effectiveRange:nil]
                                         context:nil].size;
    height += size.height;
    return height;
}
NSString *nickName = @"some nickname"; // gets the nickname
NSString title = [NSString stringWithFormat:@"%@ wrote:", nickName];
NSString *detail = @"some text"; // gets the content of the message

[cell.textLabel setText: title];
[cell.detailTextLabel setText: detail];
cell.detailTextLabel.numberOfLines = 0;
cell.detailTextLabel.lineBreakMode = NSLineBreakByWordWrapping;

为什么单元格的高度太短?

来自方法
boundingRectWithSize:options:attributes:context:

:

“此方法返回字符串中glyph的实际边界”

缺少的是单元格的边距,可以使用
单元格访问。layoutMargins

height += cell.layoutMargins.top + cell.layoutMargins.bottom;

尝试使用
NSAttributedString
的boundingRect方法(Swift 3)

在目标C中:

// change this value with the width of your UITableViewCell
CGFloat availableWidth = 355;

NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"your string"];
CGRect stringBoundingRect = [attrStr boundingRectWithSize:CGSizeMake(availableWidth, CGFLOAT_MAX) options: NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesDeviceMetrics context:nil];

CGFloat height = stringBoundingRect.size.height;

为什么要设置行高??为什么不使用EstimateDrowEight?也许可以使用自动布局: