我的UICollectionView
包含一些大的UICollectionViewCells
。这些单元格太大,以至于它们完全填满UICollectionView
边界并延伸到屏幕外。
问题在于,大型单元格从UICollectionView
中删除,并在仍然显示时排队等待重复使用,从而产生空白视图。如果我继续在空白UICollectionView
区域滚动,最终会出现单元格的最后部分,并且下一个单元格的开头会出现在正确的位置。
我已经有效地禁用了单元格重用,问题仍然明显发生,因为UICollectionView
认为单元格不再显示,因为没有角落在集合视图的范围内。
为了演示制作一个单一列的集合视图并且具有10000px高的单元格,当滚动非常高的单元格时,它将在大约1000px的内容滚动离开屏幕后消失,并将重新出现以显示最终电池的1000px内容。
您可以在http://jack.cox.s3.amazonaws.com/collectionviewprototype.zip
下载一个显示此问题的简单原型应用答案 0 :(得分:1)
在调试日志中发生此问题以及此警告:
未定义
UICollectionViewFlowLayout
的行为,因为: 项height
必须小于UICollectionView
的高度 减去部分insets
top
和bottom
值。
开箱即用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 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);
}