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

Большие ячейки в UICollectionView удаляются, пока ячейка все еще отображается

У меня есть UICollectionView который содержит несколько больших UICollectionViewCells. Эти ячейки настолько велики, что полностью заполняют границы UICollectionView и выходят за пределы экрана.

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

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

Чтобы продемонстрировать создание представления коллекции, состоящего из одного столбца и имеющего ячейку высотой 10000 пикселей, при прокрутке по очень высокой ячейке оно исчезнет после того, как около 1000 пикселей содержимого будет прокручиваться с экрана, и снова появится, чтобы отобразить окончательные 1000 пикселей содержимого для клетки.

Вы можете скачать простое приложение-прототип, отображающее эту проблему, по адресу: http://jack.cox.s3.amazonaws.com/collectionviewprototype.zip

4b9b3361

Ответ 1

Эта проблема произошла для меня вместе с этим предупреждением в журнале отладки:

поведение UICollectionViewFlowLayout не определенно, так как: элемент height должна быть меньше высоты UICollectionView минус раздела insets top и bottom значений.

Кажется, что из коробки UICollectionViewFlowLayout не поддерживает ячейки, больше чем экран.

Ответ 2

Эта проблема отслеживается как радар # 12889164

Ответ 3

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

- (void)updateCollectionViewForLargeCellHeight:(CGFloat)largeCellHeight {
    CGFloat currentCollectionViewHeight = CGRectGetHeight(self.collectionView.frame);
    if (largeCellHeight > currentCollectionViewHeight) {
        self.collectionViewBottomConstraint = -largeCellHeight; 
        //This is the bottom constraint of the collectionView to its superview. 
        //If you are not using constraints, simply set the frame for the collectionView
        UIEdgeInsets edgeInset = UIEdgeInsetsMake(0, 0, largeCellHeight, 0);
        self.collectionView.contentInset = edgeInset;
        self.collectionView.scrollIndicatorInsets = edgeInset;
        [self.collectionView needsUpdateConstraints];
    }
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGSize size;
    [self updateCollectionViewForLargeCellHeight:size.height];
    return size;
}

Ответ 4

Я использовал UICollectionView с ячейками размера экрана. Для iPad размер ячейки был 768x1024. И не обнаружили никаких проблем. Убедитесь, что вы установили Min Spacing For Cells и For Lines 0. Также верните правильные CGSize и UIEdgeInsets следующим образом


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGSize retval;
    retval.width=maxWidth; //768 in case of iPad
    retval.height=maxHeight; //1024 in case of iPad
    return retval;
}

- (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
return UIEdgeInsetsMake(0 , 0, 0, 0);
}