16

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

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

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

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

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

4

4 回答 4

1

这个问题与调试日志中的警告一起发生在我身上:

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

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

于 2013-09-26T19:45:00.503 回答
0

这个问题被跟踪为雷达#12889164

于 2013-03-01T12:40:38.220 回答
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;
}
于 2013-11-04T22:57:45.617 回答
0

我已经使用UICollectionView了屏幕大小的单元格。对于 iPad,单元格大小为 768x1024。并且没有发现任何问题。请确保您已设置Min Spacing For Cells并且For Lines0返回正确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);
}
于 2014-01-09T10:38:30.667 回答