UICollectionView 中的大单元格在仍显示的情况下被删除

Posted

技术标签:

【中文标题】UICollectionView 中的大单元格在仍显示的情况下被删除【英文标题】:Large cells in a UICollectionView getting removed while the cell is still displayed 【发布时间】:2012-10-22 17:09:23 【问题描述】:

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

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

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

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

您可以在以下位置下载一个显示此问题的简单原型应用程序:http://jack.cox.s3.amazonaws.com/collectionviewprototype.zip

【问题讨论】:

我也遇到了同样的问题,不知道怎么解决,你解决了吗? 我解决了这个问题。我的应用程序的要求允许我将其全部放入单个 UIScrollView。我确实向 Apple 提交了错误报告,但没有收到任何回复。 我也为此提交了一份雷达文件,FWIW。 我对@kai 问题发布了一个骇人听闻的答案 你们能把雷达的链接贴出来让我复制一下吗?我也遇到了这个问题。 【参考方案1】:

在调试日志中出现了这个问题以及这个警告:

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

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

【讨论】:

你是如何解决这个问题的@rob.effect 我通过实现自己的布局解决了这个问题,该布局不受单元格大小的限制。 UICollectionViewFlowLayout 是一个相当简单的布局,不需要很长时间重写。 如果可能你能@rob.effect分享你的自定义UICollectionViewFlowLayout代码吗?【参考方案2】:

此问题正在作为雷达 #12889164 进行跟踪

【讨论】:

找不到那个雷达。有链接吗? @azromej 你有没有机会把它添加到 Open Radar 中? openradar.appspot.com @DanyalAytekin 我会为将来的错误做这件事;对于这个,它似乎在 ios7 中已修复 谢谢,虽然我的自定义布局仍然会发生在我身上:(【参考方案3】:

如果您仍在寻找快速解决方案,请尝试此修复: 当检测到一个单元格的高度大于持有它的集合视图时,集合视图只需要大于该单元格。所以将 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;

【讨论】:

【参考方案4】:

我使用了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);

【讨论】:

以上是关于UICollectionView 中的大单元格在仍显示的情况下被删除的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 单元格在可见时不断重新加载

UICollectionView 单元格在我滚动时消失

UICollectionView 隐藏/防止单元格在 Sticky Header 后面滚动

UICollectionView 的单元格在滚动后并不总是刷新

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?

UICollectionView 单元格在swift中使用约束固定宽度和动态高度