动态计算自定义 UITableViewCell 的高度

Posted

技术标签:

【中文标题】动态计算自定义 UITableViewCell 的高度【英文标题】:Calculating dynamically the height of a custom UITableViewCell 【发布时间】:2015-07-14 10:53:48 【问题描述】:

我正在构建一个没有 IB 的应用程序,并且我正在从头开始编写所有内容。我有一个自定义 UITableViewCell ,当我尝试计算高度时,它的行为就像没有子视图一样。我可以找到很多关于动态设置高度的讨论,但没有真正关于如何计算它,基于子视图以及如何以及在哪里设置约束。我所做的是为我的第一个组件 - UIImageView 设置约束并将它们添加到我的单元格的 contenView 中。我得到的是0。

我将不胜感激任何关于这个或至少方向的意见!

heightForRowAtIndexPath:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    UITableViewCell* cell = [[UITableViewCell alloc]init];
    cell.imageView.image = [UIImage imageNamed:@"avatar"];

    cell.imageView.translatesAutoresizingMaskIntoConstraints=NO;

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[image]" options:0 metrics:nil views:@ @"image": cell.imageView ];

    [cell.contentView addConstraints:constraints];

    NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[image]" options:0 metrics:nil views:@ @"image": cell.imageView];

    [cell.contentView addConstraints:constraints2];

    [ NSLayoutConstraint constraintWithItem:cell.imageView attribute: NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual toItem:cell.imageView attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0f];

     CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    NSLog(@"%f",height);

    return height;


【问题讨论】:

【参考方案1】:

我对这类问题的解决方案是UITableViewAutomaticDimension。您只需在 heightForRowAtIndexPath 方法中返回它。您必须将 tableView.estimatedRowHeight 设置为接近您将获得的值。

例如,如果您有 5 个高度为 [100,200,250,270,300] 的单元格,您可以将 estimatedRowHeight 设置为 220(或类似的值)。

您也可以在Using Auto Layout in UITableView for dynamic cell layouts & variable row heights 上查看第一个答案。

【讨论】:

我得到的是-1。 因为是后面计算的,所以你用这个值让uitableview知道它会计算高度。你的用户界面正确吗? 我猜不是...不过我收到了一个新警告: 仅警告一次:检测到约束模糊地建议 tableview 单元格的内容视图高度为零的情况。我们正在考虑意外折叠并使用标准高度。设置 UIImageView 的约束时,内容视图不应该自动设置为一个值吗? 尝试实现estimatedHeightForRowAtIndexPath,应该可以消除警告。我在少数项目中使用这种方法,它可以正确呈现 ui,并满足所有约束。 也不工作,我收到同样的警告。我在想的是在构建自定义单元格时我遗漏了一些东西,但我还不知道是什么。【参考方案2】:

我不确定这是否可行,或者它是否正确,但请尝试这种方式

static NSInteger someCell = 1;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [UITableViewCell new];
    cell.tag = someCell;


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.tag == someCell) return 100.;
    return 30.;

【讨论】:

以上是关于动态计算自定义 UITableViewCell 的高度的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发总结-UITableView 自定义cell和动态计算cell的高度

如何动态计算自定义展开/可折叠 UITableViewCell 的高度

自定义 UITableViewCell 的动态高度问题

自定义UITableViewCell:Cell高度分割线间距等

自定义 uitableviewcell 中的动态标签数

嵌入在 UITableViewCell 中的动态、自定义布局 UICollectionView