【问题标题】:Calling `[UIView -systemLayoutSizeFittingSize:]` on a UITableViewCell always fails在 UITableViewCell 上调用 `[UIView -systemLayoutSizeFittingSize:]` 总是失败
【发布时间】:2013-07-08 16:47:13
【问题描述】:

我想为 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) 的大小不应满足所有约束条件。

有什么想法吗?

【问题讨论】:

  • 我遇到了和你一样的bug,你解决了吗?

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


【解决方案1】:

这对我有用(注意“contentView”)

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

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

How to resize superview to fit all subviews with autolayout?

【讨论】:

  • 这对我来说是关键。如果我的自动布局约束恰到好处,那么我在 [UITableView -heightForRowAtIndexPath:] 中需要做的就是返回 [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;和行调整为新的布局。很简单。
【解决方案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) 吗?
  • 听起来应该可以。您将图像保存在 UIImageView 中并将其添加到单元格视图中?另外,我认为使用 UITextView 的这个想法可能比使用 NSString 方法更好,因为我在使用多行字符串时遇到了 NSString 的一些问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 2023-03-30
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
相关资源
最近更新 更多