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

Nic*_* S. 2 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 )>  
Run Code Online (Sandbox Code Playgroud)

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

  1. 当用户选择一个单元格时,在我的子类UITableView中调用didSelectRowAtIndexPath,我在其中更新名为selectedRowIndex的成员.
  2. 同样在didSelectRowAtIndexPath中,我在一个单元格上调用addConstraint(我通过[tableView cellForRowAtIndexPath:indexPath]检索).这是一个垂直约束:"V:| - (42) - [embeddedTableView]",它确保在单元格的详细信息视图中的另一个嵌入表上方有空格.
  3. 在didSelectRowAtIndexPath完成后,调用heightForRowAtIndex.我对heightForRowAtIndex的实现将检查selectedRowIndex值并为所选行返回更大的高度.

在步骤2,发生上述"无法同时满足约束"错误.我相信这是因为didSelectRowAtIndexPath在heightForRowAtIndex之前被调用.我的预感是translatesAutoresizingMaskIntoConstraints设置(在我的实现中是YES)是基于单元格高度的运行时值创建新约束,该值在运行didSelectRowAtIndexPath代码后更新.

是否有推荐的方法来解决此问题?或者是否有另一种方法来执行单元格扩展,这仍然允许我为单元格的内容设置必要的单元格约束?

Nic*_* S. 6

弄清楚了.我的部分问题与此处的解决方案有关:UITableViewCellContentView高度与heightForRowAtIndexPath有何不同:

我发现我需要添加[self.contentView setAutoresizingMask:UIViewAutoresizingFlexibleHeight]单元格的子类,awakeFromNib以允许调整单元格的高度.

不过,这不是整个解决方案.在做了一些阅读之后,我找到了我addConstraint之前调用的另一个问题的答案heightForRowAtIndex.我的怀疑是正确的,这是有问题的调用addConstraintdidSelectRowAtIndexPath.

UIView类参考,以添加约束的正确方法是我打电话给- (void)setNeedsUpdateConstraintsdidSelectRowAtIndexPath.这会导致调用updateConstraints,这是我必须为自定义约束更新实现的函数.