我有一个自定义UITableViewCell,其中我有一个包含多个子视图的UIView。根据具体情况,我会隐藏其中的一些视图,并更新约束,以便父UIView仍然位于我的UITableViewCell的中心。
我的问题是,由于细胞重用,这只有在细胞不被直接显示时才有效(如果细胞不是表中首先出现的顶部细胞之一)。在这种情况下,当我向下滚动,然后向上滚动时,它再次起作用。图片将帮助我解释这个:
这是第一次加载UITableView时显示的内容。第一个单元格是包含所有信息的常规单元格,第二个单元格是隐藏第一个元素的单元格。
当我向下滚动,然后再向上时,会发生这种情况。
正如您所看到的,这正是我想要的。约束已正确更新,但只有一旦细胞从可见屏幕消失,再次出现。
[reviewsAndPriceView setNeedsUpdateConstraints];
[reviewsAndPriceView setNeedsLayout];
[reviewsAndPriceView layoutIfNeeded];
[self updateConstraints];
[self setNeedsUpdateConstraints];
[self setNeedsLayout];
[self layoutIfNeeded];
各种变化,但它不起作用。实现这个目标的方法是什么?
答案 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()
}