我已经设置了一个UICollectionView
(使用默认的流程布局和垂直滚动),其中包含从xib加载的自定义单元格。单元格包含一些元素(UILabel
和UIView
),并对它们有约束。我设置了约束条件,使用iOS8中estimatedItemSize
提供的新UICollectionViewFlowLayout
属性,随着标签文本高度的增加,单元格高度增加:
layout.estimatedItemSize = CGSizeMake(self.collectionView.frame.width, 100)
一切都像魅力一样除了之外还有一个大问题:UICollectionView
只加载numberOfItemsInSection
方法返回的一半项目。因此,当方法返回时,例如10,我的UICollectionView
只显示5个单元格(但显示并完美地放置它们)。
我调试尝试的一些相关结果:
invalidateLayout
或将部分数量从1更改为2来强制加载其余项目。但这些只是调试黑客。estimatedItemSize
属性替换itemSize
时,一切都像魅力一样,即硬编码项目大小。但这会破坏我想要实现的自我调整功能。 我认为我对自我大小的细胞的思考方式存在问题。具体来说,我想知道问题是否与约束有关。
我很感激这里有任何帮助。
答案 0 :(得分:5)
我认为这是由于iOS8中的一个错误,从iOS8.3开始仍然存在。
如果estimatedItemSize
太小,使用自定义单元格的流布局集合视图将无法显示其某些内容。尽管根据API文档,estimatedItemSize
的唯一要求是触发自行调整大小的行为是非零的。
只有Apple可以解决这个问题。我认为同时最好的解决方法是将一个膨胀的值放入estimatedItemSize`。
此回购演示了此问题:https://github.com/algal/SelfSizingCellsDemo。 (我已经在rdar:// 18078598提交了一个雷达。)
答案 1 :(得分:2)
明显的非hacky解决方案是实现
flowLayout.collectionView(layout:sizeForItemAtIndexPath:)
但当然这比你想象的更多代码。
我建议你尝试另外两件事:
CGSizeZero
。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
所有单元格出现!!
希望这可以帮助。祝你好运。