2013-03-20 3 views
4

Я заметил, что UICollectionView звонит collectionView:cellForItemAtIndexPath: на свой источник данных довольно много раз. Например, на каждом layoutSubviews все ячейки «переконфигурированы», независимо от того, были ли они уже видимы или нет.UICollectionView ячейка настраивается слишком много раз

Когда collectionView:cellForItemAtIndexPath: называется, мы должны:

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

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

Как избежать избыточной конфигурации ячеек? Или что-то я не понимаю правильно?

+1

Заканчивать CollectionView: willDisplayCellAtIndexPath и посмотреть, если он называется больше или меньше раз, чем cellForItemAtIndexPath. Вам действительно нужно использовать cFIAIP для размещения ячейки, wDCAIP - это то, где вы должны выполнять фактическую логику отображения. –

ответ

1

Я не думаю, что вы можете избежать этого. Проблема в том, что UICollectionView настолько общий, и FlowLayout - не единственный макет. Поскольку вам разрешено создавать сумасшедшие макеты, любое изменение макета, например layoutsubviews, может полностью изменить желаемый макет - сетка в портретном и треугольном расположении в ландшафте ... Единственный способ узнать, что такое макет, чтобы узнать местоположение и размер каждой ячейки.

UICollection мнение не дешево много и много элементов.

0

Просто после настройки cell просто используйте cell.tag = 1;, затем в следующий раз вы можете избежать перенастройки одной и той же ячейки с помощью if(!cell.tag).

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:YourCellReuseIdentifier forIndexPath:indexPath]; 
    if(!cell){ 
     //Create cell ... 
    } 
    if(!cell.tag){ 
     //Do things you have to do only once 
    } 
    else{ 
     //DO things you have to do every time. 
    } 

    return cell; 
} 
Смежные вопросы