在仍显示单元格时,UICollectionView中的大单元格将被删除

时间:2012-10-22 17:09:24

标签: iphone ios uicollectionview uicollectionviewcell

我的UICollectionView包含一些大的UICollectionViewCells。这些单元格太大,以至于它们完全填满UICollectionView边界并延伸到屏幕外。

问题在于,大型单元格从UICollectionView中删除,并在仍然显示时排队等待重复使用,从而产生空白视图。如果我继续在空白UICollectionView区域滚动,最终会出现单元格的最后部分,并且下一个单元格的开头会出现在正确的位置。

我已经有效地禁用了单元格重用,问题仍然明显发生,因为UICollectionView认为单元格不再显示,因为没有角落在集合视图的范围内。

为了演示制作一个单一列的集合视图并且具有10000px高的单元格,当滚动非常高的单元格时,它将在大约1000px的内容滚动离开屏幕后消失,并将重新出现以显示最终电池的1000px内容。

您可以在http://jack.cox.s3.amazonaws.com/collectionviewprototype.zip

下载一个显示此问题的简单原型应用

4 个答案:

答案 0 :(得分:1)

在调试日志中发生此问题以及此警告:

  

未定义UICollectionViewFlowLayout的行为,因为:   项height必须小于UICollectionView的高度   减去部分insets topbottom值。

开箱即用UICollectionViewFlowLayout似乎不支持大于屏幕的单元格。

答案 1 :(得分:0)

此问题正在被追踪为雷达#12889164

答案 2 :(得分:0)

如果您仍在寻找快速解决方案,请尝试此修复: 当检测到单元格的高度大于保持它的集合视图时,集合视图只需要大于单元格。因此,将collecitonView框架设置得更大,并更正内容和指示符插入内容。

- (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;
}

答案 3 :(得分:0)

我已将UICollectionView用于屏幕大小的单元格。对于iPad,单元格大小为768x1024。并没有发现任何问题。请确保您已将Min Spacing For CellsFor Lines设置为0并返回正确的CGSizeUIEdgeInsets,如下所示


- (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);
}