Хотя я не могу говорить со всеми представлениями больших коллекций, если вы видите всю задержку в расчете приблизительного размера, то определение размеров ваших ячеек другим способом, вероятно, очень поможет.Так как в этом сценарии у вас фиксированная ширина, и вам просто нужно рассчитать высоту для каждой ячейки, вы можете выполнить все расчеты по размеру из основного потока, что, как мы надеемся, остановит прокрутку, которая станет отстойной и не отвечает.
На практике для каждой «страницы» изображений (я бы рекомендовал начать с 20, но вы можете настроить это в зависимости от того, как это работает в вашей ситуации), рассчитать необходимую высоту ячейки для каждого.Сделайте это в фоновой очереди, посмотрев на UIImage
imageSize
и получив высоту вашей ячейки с помощью: (imageSize.height / imageSize.width) * UIScreen.main.bounds.size.width
.Вам нужно будет хранить их в памяти, возможно, лучше всего вместе с самими изображениями, и тогда ваш метод sizeForItemAtIndexPath
может просто индексировать эту структуру данных для размера ячейки.Затем, когда пользователь прокручивает страницу, рассчитайте размеры для «следующей страницы», прежде чем они попадут туда (используя API предварительной выборки collectionView или просто подключив делегаты UIScrollView
.
Вы можетедаже сделать это вычисление в sizeForItemAtIndexPath
напрямую, но вычисление в фоновом режиме будет еще более эффективным. Впрочем, вычисление напрямую в этом методе может быть более простым первым шагом:).