2017-02-10 10 views
1

カスタムUITableViewCellがあり、複数のサブビューを含むUIViewがあります。場合によっては、これらのビューの一部を非表示にして、親UIViewがまだ私のUITableViewCellの中央にくるように制約を更新します。UITableViewCell - リロード後にのみ更新される制約

私の問題は、セル再利用のため、これは、セルが直接表示されていない場合(セルが表の先頭に表示されている最上部のセルの1つではない場合)にのみ有効です。そのような場合、私が下にスクロールし、私が戻ってスクロールすると、それは再び働く。画像はこれを説明するのに役立ちます:

これは初めてUITableViewを読み込んだときに表示されるものです。最初のセルはすべての情報を持つ通常のセルで、2番目のセルは最初の要素が隠されているセルです。

First view

これは私がスクロールダウンしたときに何が起こるかで、その後、バックアップします。

enter image description here

あなたが見ることができるように、それは私が望むまさにそれです。制約は正しく更新されていますが、セルが表示された画面から消えてから再び表示されます。

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

さまざまなバリエーションがありますが、機能しません。これを達成する方法は何ですか?

答えて

1

あなたはすでにcellsが再利用されていることを知っています。

cellsをスクロールすると、前に表示されたconstraintが使用されています。

この問題を解決するには、constraintxibに割り当てられたデフォルト値にリセットするリセット方法を使用します。

このメソッドの後に、高さ/幅を変更するメソッドを呼び出します。

そして、最後のコール時にのみ:

[self layoutIfNeeded]; 
+0

したがって、すべての制約をどこでリセットする必要がありますか? cellForIndexPathの冒頭に?私はこれをやってみたが、何も変わらない。 –

+0

この行の後の@bloemy: 'cell = [tableView dequeCellWith .....];' – Dalvik

+0

これも解決していないようです。だから、セルを生成した後、すべての制約を元の値にリセットしてから、それらを再変更する必要がありますか?奇妙な部分は、それらをリセットすることも何も変わらないということです。 –

2

私は同じ問題がありました。私はcell.layoutIfNeeded()と呼んで、cellForRowAtIndexPathにセルを返すように解決しました。今、私のために働いています。

関連する問題