使用自调整大小单元垂直滚动UICollectionView仅显示一半单元格

时间:2014-08-29 18:06:15

标签: ios swift uicollectionview ios8 uicollectionviewcell

我已经设置了一个UICollectionView(使用默认的流程布局和垂直滚动),其中包含从xib加载的自定义单元格。单元格包含一些元素(UILabelUIView),并对它们有约束。我设置了约束条件,使用iOS8中estimatedItemSize提供的新UICollectionViewFlowLayout属性,随着标签文本高度的增加,单元格高度增加:

layout.estimatedItemSize = CGSizeMake(self.collectionView.frame.width, 100)

一切都像魅力一样除了之外还有一个大问题:UICollectionView只加载numberOfItemsInSection方法返回的一半项目。因此,当方法返回时,例如10,我的UICollectionView只显示5个单元格(但显示并完美地放置它们)。

我调试尝试的一些相关结果:

  • 我已经能够通过调用invalidateLayout或将部分数量从1更改为2来强制加载其余项目。但这些只是调试黑客。
  • 另外,当我用estimatedItemSize属性替换itemSize时,一切都像魅力一样,即硬编码项目大小。但这会破坏我想要实现的自我调整功能。

我认为我对自我大小的细胞的思考方式存在问题。具体来说,我想知道问题是否与约束有关。

我很感激这里有任何帮助。

4 个答案:

答案 0 :(得分:5)

我认为这是由于iOS8中的一个错误,从iOS8.3开始仍然存在。

如果estimatedItemSize太小,使用自定义单元格的流布局集合视图将无法显示其某些内容。尽管根据API文档,estimatedItemSize的唯一要求是触发自行调整大小的行为是非零的。

只有Apple可以解决这个问题。我认为同时最好的解决方法是将一个膨胀的值放入estimatedItemSize`。

此回购演示了此问题:https://github.com/algal/SelfSizingCellsDemo。 (我已经在rdar:// 18078598提交了一个雷达。)

答案 1 :(得分:2)

明显的非hacky解决方案是实现

flowLayout.collectionView(layout:sizeForItemAtIndexPath:)

但当然这比你想象的更多代码。

我建议你尝试另外两件事:

  1. 尝试尝试更合理的估计尺寸。另请尝试使用默认值CGSizeZero
  2. 通过检查preferredlLayoutAttributesFittingAttributes()参数,检查layoutAttributes中发生的情况。也许你找到了为什么其他细胞被“挤出来”的线索。

答案 2 :(得分:1)

在UICollectionViewFlowLayout

的自定义子类中

覆盖prepareLayout,如下所示:

- (void)prepareLayout {
  [super prepareLayout];
  CGSize contentSize = self.collectionView.contentSize;

  // Without this line, the scrolling doesn't go all the way to the bottom, right away but takes a while
  [super layoutAttributesForElementsInRect:CGRectMake(0.0f, 0.0f, contentSize.width, contentSize.height)];
}

答案 3 :(得分:0)

我有同样的问题。 我正在使用layout.estimatedItemSize = CGSizeMake(373.0, 500.0)

preferredLayoutAttributesFittingAttributes( layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes!

我得到了我想要的自我调整行为,除了我只显示了一半的单元格。 奇怪的是当我将estimatedItemSize属性更改为:layout.estimatedItemSize = view.bounds.size所有单元格出现!! 希望这可以帮助。祝你好运。