В iOS 12, когда UICollectionView создается с использованием ячеек Self Sizing с ограничениями, при перезагрузке макет имеет неправильную высоту до прокрутки - PullRequest
1 голос
/ 21 мая 2019

У меня странная проблема в iOS 12 при использовании решения, как объяснено здесь .

Это прекрасно работает, когда представление коллекции загружается впервые, однако, когда я пытаюсь перезагрузить представление коллекции, используя collectionView.reloadData() или collectionView.collectionViewLayout.invalidateLayout(), добавляется странная высота в ячейку.

Как только я начну прокручивать, все снова будет нормально. Пожалуйста, смотрите изображения ниже. Первое изображение показывает рабочие высоты для ячеек после просмотра нагрузок. Второй показывает ячейки после перезагрузки.

Works great at first load

After clicking on reload bar button

Кнопка панели перезагрузки вызывает следующий метод.

@objc func reloadCollectionView() {
        collectionView.collectionViewLayout.invalidateLayout()
}

Пожалуйста, просмотрите пример проекта в GitHub здесь для воспроизведения проблемы. Я использовал Xcode 10.1 и 10.2, чтобы воспроизвести проблему.

Буду очень признателен за любую помощь или направление для решения проблемы!

Заранее спасибо.

1 Ответ

1 голос
/ 21 мая 2019

Я думаю, проблема в том, что вы звоните:

flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

в вашем проекте.

Если вы сбросите это как-то так:

layoutFlow.estimatedItemSize = CGSize(width: UIScreen.main.bounds.size.width, height: 100)

Тогда он сразу становится более плавным.

Примечание: Стоит отметить, что оценочная высота, на которую вы устанавливаете свои ячейки, имеет значение. Если вы установите его в 0, то reloadData() прокрутит collectionView к вершине. Установка точного значения лучше всего подходит для тестирования

Есть еще несколько ошибок, которые, кажется, исправлены удалением

collectionView.collectionViewLayout.invalidateLayout()

и поменять его на что-то вроде

collectionView.reloadData()
collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)

Я не знаю, для какого именно назначения вы этого хотите, поэтому я не могу полностью проверить, как это должно быть, но invalidateLayout кажется неправильным способом перезагрузить collectionView.

...