选择时调整单元格大小时NSAutoResizingMaskLayoutConstraint错误

时间:2014-09-14 05:22:20

标签: ios autolayout nslayoutconstraint

我正在实现一个自定义UITableView,它将垂直展开单个单元格以在用户点击单元格时显示详细信息。

我在didSelectRowAtIndexPath处理程序中将addConstraint调用到UITableViewCell时遇到问题:

Unable to simultaneously satisfy constraints.
...
If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0xa0c9cc0 V:[UITableView:0xc339c00]-(0)-|   (Names: '|':UITableViewCellContentView:0xa0c8910 )>",
    "<NSAutoresizingMaskLayoutConstraint:0xa0b8600 h=--& v=--& V:[UITableViewCellContentView:0xa0c8910(25)]>",
    "<NSLayoutConstraint:0xa0caad0 V:|-(42)-[UITableView:0xc339c00]   (Names: '|':UITableViewCellContentView:0xa0c8910 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa0c9cc0 V:[UITableView:0xc339c00]-(0)-|   (Names: '|':UITableViewCellContentView:0xa0c8910 )>  

以下是我实施的更多细节:

  1. 当用户选择一个单元格时,在我的子类UITableView中调用didSelectRowAtIndexPath,我在其中更新名为selectedRowIndex的成员。
  2. 同样在didSelectRowAtIndexPath中,我在一个单元格上调用addConstraint(我通过[tableView cellForRowAtIndexPath:indexPath]检索)。这是一个垂直约束:&#34; V:| - (42) - [embeddedTableView]&#34;,它确保在单元格详细视图中的另一个嵌入表上方有空格。
  3. 在didSelectRowAtIndexPath完成后,调用heightForRowAtIndex。我对heightForRowAtIndex的实现将检查selectedRowIndex值并为所选行返回更大的高度。
  4. 在步骤2,以上&#34;无法同时满足约束&#34;发生错误。我相信这是因为didSelectRowAtIndexPath在heightForRowAtIndex之前被调用。我的预感是translatesAutoresizingMaskIntoConstraints设置(在我的实现中是YES)是基于单元格高度的运行时值创建新约束,该值在运行didSelectRowAtIndexPath代码后更新。

    是否有推荐的方法来解决此问题?或者是否有另一种方法来执行细胞扩增,这仍然允许我为细胞的内容设置必要的细胞限制?

1 个答案:

答案 0 :(得分:6)

想出来。我的部分问题与此处的解决方案有关:How is it possible that UITableViewCellContentView height is different from heightForRowAtIndexPath:

我发现我需要在单元格的[self.contentView setAutoresizingMask:UIViewAutoresizingFlexibleHeight]中添加awakeFromNib,以便调整单元格的高度。

但是,这并不是整个解决方案。在做了一些阅读之后,我找到了与调用addConstraint之前调用heightForRowAtIndex相关的其他问题的答案。我怀疑在addConstraint中拨打didSelectRowAtIndexPath是有问题的。

根据UIView Class Reference,添加约束的正确方法是让我在- (void)setNeedsUpdateConstraints中调用didSelectRowAtIndexPath。这导致调用updateConstraints,这是我必须为自定义约束更新实现的函数。