Подтвердить что ты не робот

UICollectionView: различные элементы размера не рассчитываются для повторно используемых элементов

У меня есть представление коллекции с различными размерами элементов, которые я объявляю в

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    FeedItem *item = [_imagesLinkArray objectAtIndex:indexPath.row];
    return CGSizeMake(250, 200*item.sizeFactor);
}

Когда ячейка повторно используется в collectionView:cellForItemAtIndexPath: элемент отображается с добавленным размером элемента, а не указанным в sizeForItemAtIndexPath:.

любые идеи?

4b9b3361

Ответ 1

Кажется, что collectionView:layout:sizeForItemAtIndexPath: вызывается один раз при компоновке, прежде чем CollectionView будет визуализирован.

Поэтому всякий раз, когда вы прокручиваете и ячейка удаляется, она изменяется на размер, предоставляемый collectionView:layout:sizeForItemAtIndexPath: на этапе подготовки. Ожидаете ли вы, что этот метод будет вызываться всякий раз, когда будет видна ячейка с определенным индексом? Чтобы вы могли динамически изменять размер ячейки? похоже, это не так, как этот метод можно использовать, его можно использовать для определения размера ячейки один раз на этапе подготовки макета.

Если вам нужны размеры, которые нужно перечислить по какой-либо причине, вы можете аннулировать макет с помощью [UICollectionViewLayout invalidateLayout].

Ответ 2

Кажется, что представление коллекции пересчитывает элементы реже, чем UITableView. Вы должны сообщить в виде коллекции о большинстве изменений базовой модели, например. вызывая [collectionView reloadData] или [collectionView insertItemsAtIndexPaths:indexPaths].

Ответ 3

Вам нужно переопределить эту функцию в настраиваемом классе макета., если вы используете пользовательский макет.

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
return true
}

Ответ 4

Вы можете просто переопределить делегат представления прокрутки

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    collectionView.collectionViewLayout.invalidateLayout()
}