UICollectionViewFlowLayout的estimatedItemSize是否会中断滚动?

时间:2014-12-26 17:10:25

标签: ios objective-c iphone uicollectionview uicollectionviewlayout

编辑:从 iOS 9 开始,它似乎工作正常。我没有进行大量测试,但示例有效。这证实了iOS中存在的错误8)

我花了很多时间测试UICollectionView的Flow Layout自我调整大小的行为。经过很多挫折后,问题被缩小到这样一个事实,即只要将estimatedItemSize设置为非零大小,滚动就不再正常工作。

在我的示例中,它不显示40个项目,而只显示32.

我复制粘贴下面的代码。我从Swift版本开始测试了很多东西。

基本上它无法计算和/或正确更新布局collectionViewContentSize()

以下是完整的演示http://git.io/AIrHNA

任何人都能指出我正确的方向吗?

谢谢

@implementation ViewControllerObjcC

static NSString * const reuseIdentifier = @"Cell";
-(UICollectionViewFlowLayout*)flowLayout{
  return (UICollectionViewFlowLayout*)self.collectionViewLayout;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
  CGSize estimatedSize = CGSizeMake(self.view.frame.size.width, 25.0);
  BOOL testEstimatedItemSize = true;
  if (testEstimatedItemSize) {
    [self flowLayout].estimatedItemSize = estimatedSize;
  }else{
    [self flowLayout].itemSize = estimatedSize;
  }

}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 40;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
  UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
  UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
  [cell.contentView addSubview:label];
  label.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
  label.backgroundColor = [UIColor redColor];
  return cell;
}

3 个答案:

答案 0 :(得分:1)

来自Apple's Document

  

具体而言,不在屏幕上的单元格被假定为估计高度

这是我的猜测。

当估计的高度小于实际的单元格高度时,集合视图的内容大小预测小于实际的内容大小。

因此,它只显示总共40个单元格中的32个。

在我的项目中,当使用较大的估计尺寸时,会显示所有celsl。

答案 1 :(得分:0)

来自文档:

  

此属性的默认值为CGSizeZero。将其设置为任何   其他值导致集合视图查询每个单元格   使用单元格的实际大小   preferredLayoutAttributesFittingAttributes:方法。如果你所有的   单元格高度相同,使用itemSize属性,而不是。{   此属性,用于指定单元格大小。

您的项目中似乎没有使用此preferredLayoutAttributesFittingAttributes:方法?是否尝试过实施?

另一方面,这个解决方案看起来不错: Specifying one Dimension of Cells in UICollectionView using Auto Layout

答案 2 :(得分:0)

我有同样的问题。在我的情况下,项目之间的间隔是32。我的代码是这样的:

collectionViewLayout.minimumInteritemSpacing = 0
collectionViewLayout.minimumLineSpacing = 32
collectionViewLayout.scrollDirection = .horizontal
collectionViewLayout.itemSize = UICollectionViewFlowLayout.automaticSize
collectionViewLayout.estimatedItemSize = CGSize(width: 100, height: 32)

我将minimumInteritemSpacing更改为32,与minimumLineSpacing相同,以解决此问题。

collectionViewLayout.minimumInteritemSpacing = 32