UITableCellView中UILabel的运行时宽度

时间:2015-01-21 09:31:30

标签: ios objective-c uitableview uilabel

我有一个带有一些单元格(字幕样式)的UITableView,它可以在标题和字幕字段中包含无限量的文本(这是客户要求,否则无法说服它们)。我已经构建了一些我在heightForRow中调用的方法:atIndexPath来确定UILabels的高度。这些方法取决于知道所讨论的UILabel的宽度。我不知道如何获得这个价值。目前,我已经使用在iPhone 5S模式下运行的模拟器上的日志语句提取了一个值。这不是一个稳定的解决方案。任何想法如何实现这一目标?

以下是我目前正在使用的方法:

-(CGFloat) heightForSubtitleCellWithTitleString:(NSString *)titleString withFont:(UIFont *)titleFont withDetailString:(NSString *)detailString withFont:(UIFont *)detailFont withTableView:(UITableView *)tableView

{
    if (!detailString) {
        detailString = @"Dummy text!"; // <-- Hacky, but when there is no detail text, we need to make room for the placeholder text.
    }
    CGRect rectForDetailString = [self rectForString:detailString withFont:detailFont withWidth:tableView.bounds.size.width - 54]; // 54 is the difference between the width of the label and tableview at runtime. On an iPhone 5 screen. Mæh.
    CGRect rectForTitleString = [self rectForString:titleString withFont:titleFont withWidth:tableView.bounds.size.width - 54];
    CGFloat height = ceilf(CGRectGetHeight(rectForTitleString) + CGRectGetHeight(rectForDetailString) + 10); // 10 is the padding between labels and top and bottom of the cell
    return height;
}

-(CGRect) rectForString:(NSString *)string withFont:(UIFont *)font withWidth:(CGFloat)width
{
    CGSize maximumLabelSize = CGSizeMake(width, LONG_MAX);
    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
    NSStringDrawingOptions options = NSStringDrawingTruncatesLastVisibleLine |
    NSStringDrawingUsesLineFragmentOrigin;
    NSDictionary *attr = @{NSFontAttributeName : font,
                           NSParagraphStyleAttributeName : paragraphStyle};
    CGRect labelBounds = [string boundingRectWithSize:maximumLabelSize
                                              options:options
                                           attributes:attr
                                              context:nil];
    return labelBounds;
}

2 个答案:

答案 0 :(得分:0)

让高度= 30的文字标签,固定高度

label.text = detailstext;
float lableWidth = [label sizeThatFits:CGSizeMake(INT_MAX, 30)].width;

答案 1 :(得分:0)

使用自动布局,您可以固定标签的顶部,尾部和前缘,并让其内容决定自己的大小。将行数设置为0.此外,通过自动布局,UITableViewCell根据其内容视图的子视图高度计算单元格高度。

以下方法可用于动态计算配置的单元格高度。但是你需要注意这个方法被调用每个单元格。 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

因此,如果单元格数量更多则存在性能问题/延迟。要解决此问题,我们可以使用iOS8中添加的新api。

  • (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;

此方法允许表格视图懒惰地计算每个单元格的实际高度。