[英]UITableViewCell - constraints only updated after reload
我有一個自定義的UITableViewCell,其中我有一個包含多個子視圖的UIView。 根據具體情況,我隱藏了一些視圖,並更新約束,以便父UIView仍然在我的UITableViewCell中居中。
我的問題是,由於單元格重用,這只有在沒有直接顯示單元格時才有效(如果單元格不是表格中首先出現的頂部單元格之一)。 在這種情況下,當我向下滾動,然后向上滾動時,它再次起作用。 圖片將幫助我解釋這個:
這是第一次加載UITableView時顯示的內容。 第一個單元格是包含所有信息的常規單元格,第二個單元格是隱藏第一個元素的單元格。
當我向下滾動然后再向上時會發生這種情況。
如你所見,這正是我想要的。 約束已正確更新,但只有一旦細胞從可見屏幕消失,並再次出現。
[reviewsAndPriceView setNeedsUpdateConstraints];
[reviewsAndPriceView setNeedsLayout];
[reviewsAndPriceView layoutIfNeeded];
[self updateConstraints];
[self setNeedsUpdateConstraints];
[self setNeedsLayout];
[self layoutIfNeeded];
各種變化,但它不起作用。 有什么辦法實現這個目標?
我遇到過同樣的問題。 我通過在cellForRowAtIndexPath
返回cell之前調用cell.layoutIfNeeded()
解決它。 現在,對我來說它的工作正常。
您已經知道cells
正在被重復使用。
滾動時,某些cells
使用先前顯示的constraint
。
要解決此call
使用reset方法將所有constraint
重置為xib
指定的默認值。
在此方法之后調用您的方法,該方法負責更改高度/寬度。
僅在最后一次通話中:
[self layoutIfNeeded];
我使用乘法器設計了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()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.