Как отобразить большой UICollectionView с автоматическим изменением размеров ячеек? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь отобразить UICollectionView, способный отображать пользовательскую библиотеку фотографий, в которой соблюдается соотношение сторон фотографии (ограничено шириной устройства - представьте себе, как выглядит полноэкранная подача Instagram).

Я использовал примеры из UICollectionView Self Sizing Cells с автоматической разметкой и https://medium.com/@wasinwiwongsak/uicollectionview-with-autosizing-cell-using-autolayout-in-ios-9-10-84ab5cdf35a2 (в репозитории есть ссылка на репозиторий, ссылка на которую приведена в статье, чтобы обновить проект для iOS 12 FYI), чтобы настроить UICollectionView с ячейками переменной высоты, но все они очень запаздывают / ужасно использовать при большом количестве ячеек в представлении.

Например, пример приложения (с исправлением iOS 12) здесь:https://github.com/tttsunny/CollectionViewAutoSizingTest/pull/5 прекрасно работает с 100 ячейками, но если вы попытаетесь отобразить 30 000, приложение станет непригодным для использования - оно застревает при прокрутке и не отвечает.Задержка указана в логике расчетного размера UIViewController.

. Не рекомендуется ли использовать расчетный размер для объектов большого размера UICollectionView?Что я могу сделать, чтобы ячейки имели разные значения высоты?

1 Ответ

0 голосов
/ 06 февраля 2019

Хотя я не могу говорить со всеми представлениями больших коллекций, если вы видите всю задержку в расчете приблизительного размера, то определение размеров ваших ячеек другим способом, вероятно, очень поможет.Так как в этом сценарии у вас фиксированная ширина, и вам просто нужно рассчитать высоту для каждой ячейки, вы можете выполнить все расчеты по размеру из основного потока, что, как мы надеемся, остановит прокрутку, которая станет отстойной и не отвечает.

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

Вы можетедаже сделать это вычисление в sizeForItemAtIndexPath напрямую, но вычисление в фоновом режиме будет еще более эффективным. Впрочем, вычисление напрямую в этом методе может быть более простым первым шагом:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...