UITableViewCell - 约束仅在重新加载后更新

el-*_*lor 3 objective-c reusability uitableview ios nslayoutconstraint

我有一个自定义的UITableViewCell,其中我有一个包含多个子视图的UIView.根据具体情况,我隐藏了一些视图,并更新约束,以便父UIView仍然在我的UITableViewCell中居中.

我的问题是,由于单元格重用,这只有在没有直接显示单元格时才有效(如果单元格不是表格中首先出现的顶部单元格之一).在这种情况下,当我向下滚动,然后向上滚动时,它再次起作用.图片将帮助我解释这个:

这是第一次加载UITableView时显示的内容.第一个单元格是包含所有信息的常规单元格,第二个单元格是隐藏第一个元素的单元格.

第一种观点

当我向下滚动然后再向上时会发生这种情况.

在此输入图像描述

如你所见,这正是我想要的.约束已正确更新,但只有一旦细胞从可见屏幕消失,并再次出现.

[reviewsAndPriceView setNeedsUpdateConstraints];
[reviewsAndPriceView setNeedsLayout];
[reviewsAndPriceView layoutIfNeeded];
[self updateConstraints];
[self setNeedsUpdateConstraints];
[self setNeedsLayout];
[self layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)

各种变化,但它不起作用.有什么办法实现这个目标?

小智 7

我遇到过同样的问题.我cell.layoutIfNeeded()在返回单元格之前通过调用解决了它cellForRowAtIndexPath.现在,对我来说它的工作正常.


Dal*_*vik 1

您已经知道它们cells正在被重用。

当您滚动时,某些内容cells正在使用constraint先前显示的内容。

要解决此问题,请call使用重置方法,该方法会将所有内容重置constraint为中指定的默认值xib

在此方法之后调用负责更改高度/宽度的方法。

仅在最后一次通话中:

 [self layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)