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
top
和bottom
值。
开箱即用的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 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);
【讨论】:
以上是关于UICollectionView 中的大单元格在仍显示的情况下被删除的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 单元格在可见时不断重新加载
UICollectionView 隐藏/防止单元格在 Sticky Header 后面滚动
UICollectionView 的单元格在滚动后并不总是刷新