Почему метод systemLayoutSizeFittingSize вызывается для каждого UICollectionViewCell, даже если ячейки имеют фиксированный размер?
Я сделал коллекционное представление с макетом потока, который прокручивается горизонтально. Ячейки должны иметь фиксированную ширину и заполнять вид коллекции по вертикали. Таким образом, я установил этот фиксированный размер, используя свойство макета потока itemSize
в viewDidLayoutSubviews
моего контроллера.
myCollectionViewFlow.itemSize = CGSizeMake(MyCollectionViewColumnWidth, myCollectionView.frame.size.height);
Я не даю примерный размер элемента для макета, поэтому, согласно документации Apple о собственности estimatedItemSize
из UICollectionViewFlowLayout
Я не ожидаю, что представление коллекции запрашивает размер каждой ячейки, используя ячейку preferredLayoutAttributesFittingAttributes:
метод.
Значением этого свойства по умолчанию является CGSizeZero. Установка его в любое другое значение заставляет представление коллекции запрашивать каждую ячейку для ее фактического размера, используя ячейку selectedLayoutAttributesFittingAttributes: метод. Если все ваши ячейки имеют одинаковую высоту, вместо этого используйте свойство itemSize, чтобы указать размер ячейки.
Однако, проанализировав дерево вызовов с помощью профилировщика времени на симуляторе iOS 9, я заметил, что preferredLayoutAttributesFittingAttributes:
метод вызывается в каждой ячейке. Реализация этого метода по умолчанию, по-видимому, рассчитывает компоновку подпредставления в соответствии с ограничениями. Поскольку мои клетки сложны, это занимает много времени, поэтому это позволяет избежать плавной прокрутки.
Я исправил проблему с производительностью, переопределив preferredLayoutAttributesFittingAttributes:
метод и возвращает целевой размер (так как мои клетки имеют фиксированный размер).
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
{
return targetSize;
}
Но я не могу понять, почему мне нужно сделать этот трюк с настройкой, которую я установил. И я также боюсь вызвать неожиданное поведение, подклассифицируя этот метод.
РЕДАКТИРОВАТЬ
preferredLayoutAttributesFittingAttributes:
метод не вызывается ни на симуляторе iOS 10, ни на устройстве iOS 10. К сожалению, у меня нет устройства с iOS 9 для тестирования, поэтому я не могу определить, является ли это просто ошибкой симулятора.