簡體   English   中英

UITableViewCell - 約束僅在重新加載后更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM