在UITableViewCell上调用`[UIView -systemLayoutSizeFittingSize:]`总是失败的。

20

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

我正在使用[UIView -systemLayoutSizeFittingSize:]计算适当的单元格高度(在[UITableView -heightForRowAtIndexPath:]中返回),但我一直得到以下结果:

  • 如果传递UILayoutFittingCompressedSize,我会收到大小为(0,0)的CGSize。

  • 如果传递UILayoutFittingExpandedSize,我的应用程序会崩溃,并出现以下错误:

    *** Assertion failure in -[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)不应该满足所有的约束条件。

有任何想法吗?


1
我遇到了和你一样的错误,你已经修复了吗? - ygweric
2个回答

38

这对我来说非常关键。如果我的自动布局约束设置得恰到好处,那么在 [UITableView -heightForRowAtIndexPath:] 中,我只需要返回 [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 就可以让行按照新的布局进行调整大小。简单易行。 - Chuck Krutsinger

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添加到视图中。
//////编辑
使用约束的方法存在问题,因为您想要测量未添加到视图中的单元格,因此系统缺少所有所需信息。它不知道空间等的大小,因为它不知道单元格周围的区域。

后面的方法是我目前正在使用的,但是我想停止这种做法(好吧,我正在使用[NSString -sizeWithFont: constrainedToSize:], 但是基本思路是相同的)。我的UITableViewCell包含一个子视图,UIImageView,其中有四个约束(高度=48,宽度=48,向容器的前导空间=10,向容器的顶部空间=10)。仅凭这些,systemLayoutSizeFittingSize:难道不会返回最小值为(58, 58)吗? - Aaron Brager
听起来应该可以。您将图像保存在UIImageView中,并将其添加到单元格视图中?此外,我认为使用UITextView的想法可能比使用NSString方法更好,因为在使用多行字符串时,我遇到了一些NSString的问题。 - Rafał Augustyniak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接