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

时间:2013-07-10 16:26:34

标签: ios cocoa-touch uitableview interface-builder autolayout

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

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

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

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

      

    ***断言失败 - [NSISLinearExpression incrementConstant:],/ SourceCache /Foundation_Sim / Foundation1043.1 / Lightsout.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)的大小不应满足所有约束条件。

有什么想法吗?

2 个答案:

答案 0 :(得分:37)

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

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

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

How to resize superview to fit all subviews with autolayout?

答案 1 :(得分:2)

根据您的帖子很难说具体内容,因为您没有发布您使用的约束。 Apple文档:

  

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添加到视图中。

//////编辑

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