Как синхронизировать анимацию раскрытия ячейки и обновления леяута UICollectionView?

Код проекта для примера (можно просто вставить в пустой проект): https://gist.github.com/smocer/e8c4bb3c5465c1a01bcf6aa33e0fd9dc

Проблема в том, что анимации раскрытия ячейки и сдвига других ячеек не синхронизированы (раскрытие происходит мнгновенно, а леяут обновляется плавно):

Пример анимации

Любопытно, что почему-то анимация "схлопывания" происходит плавно, параллельно сдвиганию ячеек обратно.

Вопрос в том, как достичь одновременной анимации раскрытия/схлопывания ячейки и сдвига других ячеек?

UPD: Есть еще вот такой способ

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    isExpanded[indexPath.item].toggle()
    
    collectionView.collectionViewLayout.invalidateLayout()
    UIView.animate(withDuration: 0.25) {
        collectionView.layoutIfNeeded()
    }
}

С ним данная ячейка анимируется правильно, но появляется другая проблема - некоторые ячейки с краю перемещаются без анимации вообще: https://i.imgur.com/78TOAL1.gif


Ответы (1 шт):

Автор решения: schmidt9

Я посмотрел ваш код, в данном случае сработало решение, предложенное здесь

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    isExpanded[indexPath.item].toggle()
        
    // https://stackoverflow.com/a/35996178/3004003
    collectionView.performBatchUpdates({}){_ in }
}
→ Ссылка