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 метод сброса, который сбросит все значения constraint до значения по умолчанию, указанного в xib.

После этого метода вызывается метод, который отвечает за изменение высоты и ширины.

И только в последнем вызове:

[self layoutIfNeeded]; 
+0

Итак, где я должен сбросить все ограничения? В самом начале cellForIndexPath? Я пытался это сделать, но ничего не меняет. –

+0

@bloemy после этой строки: 'cell = [tableView dequeCellWith .....];' – Dalvik

+0

Это тоже не помогает. Итак, после создания ячейки я должен сбросить все мои ограничения до их первоначального значения и затем заменить их? Странная часть заключается в том, что сброс их тоже ничего не меняет. –

2

Я была такая же проблема. Я разрешил его, позвонив cell.layoutIfNeeded() перед возвратом ячейки в cellForRowAtIndexPath. Теперь для меня это работает отлично.

Смежные вопросы