Большие ячейки в UICollectionView удаляются, пока ячейка все еще отображается
У меня есть UICollectionView
который содержит несколько больших UICollectionViewCells
. Эти ячейки настолько велики, что полностью заполняют границы UICollectionView
и выходят за пределы экрана.
Проблема заключается в том, что большие ячейки удаляются из UICollectionView
и UICollectionView
очередь для повторного использования, пока они все еще отображаются, что приводит к UICollectionView
представлению. Если я продолжу прокручивать пустую область UICollectionView
, в конечном итоге появится последняя часть ячейки, и начало следующей ячейки появится точно в нужном месте.
Я фактически отключил повторное использование ячеек, и проблема все еще возникает, по-видимому, потому что UICollectionView
считает, что ячейка больше не отображается, так как ни один угол не находится в границах представления коллекции.
Чтобы продемонстрировать создание представления коллекции, состоящего из одного столбца и имеющего ячейку высотой 10000 пикселей, при прокрутке по очень высокой ячейке оно исчезнет после того, как около 1000 пикселей содержимого будет прокручиваться с экрана, и снова появится, чтобы отобразить окончательные 1000 пикселей содержимого для клетки.
Вы можете скачать простое приложение-прототип, отображающее эту проблему, по адресу: http://jack.cox.s3.amazonaws.com/collectionviewprototype.zip
Ответы
Ответ 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);
}