Почему метод 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 для тестирования, поэтому я не могу определить, является ли это просто ошибкой симулятора.

0 ответов

Другие вопросы по тегам