2017-02-10 75 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()解決它。現在,對我來說工作正常。