20

我想为 UITableViewCells 使用自动布局。这些表格单元格具有动态高度(取决于文本长度)。

[UIView -systemLayoutSizeFittingSize:]用来计算适当的单元格高度(返回[UITableView -heightForRowAtIndexPath:]),但我不断得到以下结果:

  • 如果我通过UILayoutFittingCompressedSize,我会返回 (0,0) 的 CGSize。

  • 如果我通过UILayoutFittingExpandedSize,我的应用程序会因以下错误而崩溃:

    *** -[NSISLinearExpression incrementConstant:] 中的断言失败,/SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620

(我的猜测是这意味着某个数字是无限的。)

我的实现很简单。我计算每个对象的高度,然后缓存它:

MessageCell *cell = // allocate a new cell...

//  set up the cell (assign text, images, etc)

CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

self.cellHeight = size.height;  // size always equals (0, 0)

我假设这是我设置的约束的问题,但是:

  • 如果我手动设置cellHeight为较大的值,则单元格看起来都很好,除了高度错误。
  • Interface Builder 没有给我关于模棱两可的限制的警告
  • [cell hasAmbiguousLayout]返回NO
  • 我的单元格有一个设置为 48x48 的图像,因此 (0, 0) 的大小不应满足所有约束。

有任何想法吗?

4

2 回答 2

38

这对我有用(注意'contentView')

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

编辑:我回答了一个类似的问题并提供了一个完整的例子,在这里:

如何调整超级视图的大小以适应所有具有自动布局的子视图?

于 2013-07-22T21:55:52.873 回答
2

很难根据您的帖子说出具体的内容,因为您没有发布您使用的限制条件。苹果文档:

systemLayoutSizeFittingSize:

返回满足其约束的视图的大小。

也许您创建了可以以单元格大小等于 (0,0) 的方式解释的约束。

还有另一种方法可以使用文本检查单元格的高度。您可以将文本放在 UITextView 中,然后:

UITextView textView; 
textView.text = @"l";
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE];
//some code here
//
CGFloat cellHeight = textView.contentSize.height;

在使用 contentSize 属性之前,设置 UITextView 的文本和字体(以及所有其他可能导致 UITextView 高度变化的属性)非常重要。此外,您必须首先将 UITextView 添加到视图中。

////// 编辑

您使用约束的方法的问题可能是您想要测量未添加到视图中的单元格,因此系统没有它需要的所有信息。它不知道空间等将有多少空间,因为它不知道单元的周围区域

于 2013-07-10T16:46:14.373 回答