Я пытаюсь понять, как работает UICollectionViewLayout
, и нашел этот пример кода.
https://developer.apple.com/documentation/uikit/uicollectionview/customizing_collection_view_layouts
В примере кода (и во всех других примерах, которые я смог найти), онимеет cachedLayoutAttributes
объект и вычисляет макет всех элементов в prepare()
.
Я обнаружил 2 проблемы для этого шаблона.
Один из них, если количество источника данных достаточно велико, вычисление всегов методе prepare()
потребуется время (и он будет пересчитан при изменении макета collectionView), поэтому он не выглядит очень эффективным.
Другая проблема заключается в том, что нет никаких шансов layoutAttributesForItem
или layoutAttributesForSupplementaryView
позвоните.Только layoutAttributesForElements
вызывается, и кажется, что этого достаточно для размещения ячеек / дополнительных представлений.
Я читаю документацию, но она только говорит, что методы должны быть переопределены.Мое лучшее предположение состоит в том, что я должен использовать переопределить эти методы, чтобы вернуть соответствующий UICollectionViewLayoutAttributes
и вызвать их из layoutAttributesForElements
.Однако этот layoutAttributesForElements
вызывается всякий раз, когда пользователь прокручивает UICollectionView, поэтому он также кажется не очень эффективным.
Я хочу знать, в каком случае вызывается layoutAttributesForItem
и layoutAttributesForSupplementaryView
и что / когда / гдеЭто лучший способ / место / время для расчета UICollectionViewLayoutAttributes
, если количество источников данных огромно.
Обновление
Спасибо за комментарий.Однако похоже, что речь идет об оптимизации в цикле аннулирования.
Объекты макета, предназначенные для поддержки контекстов аннулирования, могут использовать информацию в объекте UICollectionViewLayoutInvalidationContext для оптимизации своего поведения во время цикла аннулирования.
Что означает, что UICollectionViewLayoutAttributes
уже установлены и делают недействительной только необходимую часть, верно?
Итак, где я должен вычислить UICollectionViewLayoutAttributes
в первый раз?Пожалуйста, дайте мне знать, если я ошибаюсь.