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

时间:2017-02-10 11:39:53

标签: ios objective-c uitableview nslayoutconstraint reusability

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

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

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

First view

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

enter image description here

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

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

各种变化,但它不起作用。实现这个目标的方法是什么?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

您已经知道cells正在重复使用。

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

要解决此call重置方法,该方法会将所有constraint重置为xib中指定的默认值。

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

仅限最后一次电话:

 [self layoutIfNeeded];

答案 2 :(得分:0)

我使用乘法器设计了collectoin视图单元。并且单元格的某些部分没有在真实设备上正确显示。 使用下面的3种方法并在特定时间重新加载collectoin视图,可以在真实设备上正确显示情节提要中设置的约束。

(您可以在集合视图和表视图中使用此解决方案)

override func viewDidAppear(_ animated: Bool) {

        colLessons.reloadData()
        colLessons.setNeedsLayout()
        colLessons.layoutIfNeeded()
        colLessons.reloadData()

}

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

        colLessons.reloadData()
        colLessons.setNeedsLayout()
        colLessons.layoutIfNeeded()
        colLessons.reloadData()

}

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

        colLessons.reloadData()
        colLessons.setNeedsLayout()
        colLessons.layoutIfNeeded()
        colLessons.reloadData()

}