2017-02-10 51 views
1

我有一个自定义的UITableViewCell,其中有一个包含多个子视图的UIView。根据具体情况,我隐藏了一些视图,并更新了约束,以便父UIView仍然位于我的UITableViewCell中。UITableViewCell - 限制只在刷新后更新

我的问题是,由于细胞的重复使用,只有在没有直接显示细胞的情况下(如果细胞不是表中第一个细胞)。在这种情况下,当我向下滚动,然后向上滚动时,它会再次运行。图片将帮助我解释这一点:

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

First view

这是当我向下滚动会发生什么,然后再回来了。

enter image description here

正如你所看到的,这正是我想要的。约束已被正确更新,但只有当细胞从可见屏幕消失后才再次出现。

[reviewsAndPriceView setNeedsUpdateConstraints]; 
[reviewsAndPriceView setNeedsLayout]; 
[reviewsAndPriceView layoutIfNeeded]; 
[self updateConstraints]; 
[self setNeedsUpdateConstraints]; 
[self setNeedsLayout]; 
[self layoutIfNeeded]; 

和各种变化,但它不起作用。有什么办法实现这一点?

回答

1

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

当您滚动一些cells正在使用之前显示的constraint

要解决此问题call重置方法将重置所有constraintxib中分配的默认值。

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

而且只在最后通话:

[self layoutIfNeeded]; 
+0

那么我应该在哪里重置所有约束?在cellForIndexPath的一开始?我试过这样做,但它不会改变任何东西。 –

+0

@bloemy在这行之后:'cell = [tableView dequeCellWith .....];' – Dalvik

+0

这似乎并没有解决它。所以在生成单元格之后,我应该将所有约束条件重置为其原始值,然后将其更改?奇怪的是,重置它们也不会改变任何东西。 –

2

我有同样的问题。我在cellForRowAtIndexPath返回单元格之前致电cell.layoutIfNeeded()解决它。现在,对我来说工作正常。