После проверки вашего проекта я предлагаю вам использовать немного другой подход.
После обновления модели вы можете спросить макет представления коллекции, каким будет новый размер контента ( collectionViewLayout.collectionViewContentSize ). Затем вы обновляете константу ограничения высоты.
Итак, вы должны:
- обновить вашу модель
- перезагрузить строку
- попросить макет для его нового
contentSize
- обновить константу ограничения высоты
Эта модификация в вашем проекте должна достичь этого:
// Remove the content size observing logic.
func configureForVehicle(_ vehicle: Vehicle, selectedHouseType: String) {
self.vehicle = vehicle
applianceCollectionView.reloadData()
// Set the height constraint to the new value, found in the layout's content size info.
// Since the model (self.vehicle) was already updated, the layout will return the new content size.
// Because this is all happening while the cell is being reloaded, the cell will also resize properly.
// You don't need to perform any other setNeedsLayout/layoutIfNeeded calls.
self.applianceCollectionViewHeightConstraint.constant = applianceCollectionView.collectionViewLayout.collectionViewContentSize.height
}
Обратите внимание на комментарий о том, что не требуется никаких дополнительных вызовов для обновления макета. Только звоню
tableView.reloadRows(at: [indexPath], with: .automatic)
должно быть достаточно. Ненужные обновления макета могут привести к снижению производительности.
В качестве примечания можно использовать другой подход, если вы хотите анимировать изменение высоты без перезагрузки ячейки . В этом случае вам нужно будет сохранить / найти ссылку на ячейку, которую вы хотите обновить, а затем сделать следующее:
- Обновите модель для ячейки, не вызывая вызовов перезагрузки табличного представления.
- Перезагрузите представление коллекции в обновленной ячейке.
- Обновить ограничение по высоте так же, как указано выше.
- Используйте какой-нибудь обратный вызов для уведомления вашего табличного представления о том, что ячейка хочет обновить свою высоту.
- В режиме обратного вызова
tableView.beginUpdates(); tableView.endUpdates()
. Это заставляет tableView переупорядочивать свои ячейки и анимировать изменения высоты.
Из документации beginUpdates () :
Вы также можете использовать этот метод и метод endUpdates () для анимации изменения высоты строк без перезагрузки ячейки. Эта группа методов должна завершаться вызовом endUpdates ().