2014-08-29 247 views
7

我已经设置了UICollectionView(具有默认流程布局和垂直滚动)与从xib加载的自定义单元格。单元包含几个元素(一个UILabel和一个UIView),并对它们加以限制。我已经设置了限制,使得细胞高度成长,如使用新UICollectionViewFlowLayout属性,在iOS8上的可用,estimatedItemSize标签文本高度的增加:垂直滚动UICollectionView自定义单元格只显示一半的单元格

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

一切就像一个魅力除了有一个很大的问题:UICollectionView仅加载numberOfItemsInSection方法返回的一半项目。所以,当方法返回时,比如10,我的UICollectionView只显示5个单元格(但显示并完美地显示出来)。

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

  • 我已经能够通过调用invalidateLayout或改变部分的数量从1至2迫使剩余物品的装载但这些只是调试黑客。
  • 另外,当我用itemSize属性代替estimatedItemSize时,所有东西都很有魅力,即硬编码项目大小。但是这打破了我想要实现的自我调整功能。

我假设我在考虑自我大小的细胞有什么问题。具体来说,我想知道问题是否与限制有关。

我很感谢这里的任何帮助。

+0

快速更新:这似乎是一个更普遍的错误(或者我们会发现它们只是古怪的实现细节)调整UITableViews和UICollectionViews中的单元格大小。我还没有到处提交针对UICV自动调整大小的雷达,但我把它放在了UITableView - https://github.com/rainypixels/SelfSizingCells – rainypixels 2014-10-22 01:00:15

回答

2

明显的非哈克解决方案是实现

flowLayout.collectionView(layout:sizeForItemAtIndexPath:) 

当然比你大概已经希望更多的代码,但。

我建议你尝试两两件事:

  1. 尝试实验更合理的估计大小。也请尝试默认值,CGSizeZero
  2. 通过检查layoutAttributes参数来检查preferredlLayoutAttributesFittingAttributes()中会发生什么。也许你会发现为什么其他细胞“被挤出去”的线索。
+0

谢谢,蒙迪。是的,你说'sizeForItemAtIndexPath'会在这里击败目的。我给你的建议一个镜头。改变'CGSize'的宽度小于collectionView的宽度不会改变事物;这些单元格以较小的宽度进入,并按照您在流布局中所期望的那样放置。在'layoutAttributes'中,所有内容都按顺序排列。这就是说,由于UICollectionView的contentsize属性的宽度大于320pt(我现在正在为iPhone测试),所以出现了一些排挤现象。 – rainypixels 2014-08-30 16:03:04

+0

噢,我花了一些时间去探索iOS开发论坛,虽然没有太多关于自调整UICollectionView的单元格,但我可以找到有关该功能实现的报告问题。这可能是实现的一个测试版bug。 – rainypixels 2014-08-30 16:07:42

+0

我的工作是将估计的大小设置为CGSizeZero。我尝试了一个“合理的”估计大小,并动态地改变了估计的大小,两者都没有帮助。 – Rob 2015-06-19 16:57:55

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)]; 
} 
+0

这似乎有一点帮助,但并未完全解决问题。即使这样,我们仍然遇到同样的错误。例如,我们在某些收集视图中发现了它在一台设备上的帮助,但是当我们在另一个屏幕尺寸上测试时,错误仍然发生。 – ToddH 2015-03-06 17:41:26

0

我有此相同的问题。 我使用layout.estimatedItemSize = CGSizeMake(373.0, 500.0)连同

preferredLayoutAttributesFittingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes! 

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

+1

你的例子中的'view'变量是什么? UICollectionView? – 2015-03-05 17:21:33

3

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

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

只有苹果公司有能力解决这个问题。我认为同时最好的解决方法是将虚增值放入estimatedItemSize中。

本回购协议证明了这个问题:https://github.com/algal/SelfSizingCellsDemo。 (我已经在rdar:// 18078598提交了一个雷达。)

+0

刚试图支持iOS8时遇到此问题。神秘莫测为什么我的细胞在iOS8设备上而不是在iOS9设备上消失。非常愚蠢的操作系统错误。谢谢! – Archagon 2015-12-11 21:23:23

+1

(但请注意,设置estimatedItemSize过大会使第一次滚动时滚动指示器左右晃动。) – Archagon 2015-12-11 21:31:00

+1

我对ios9还有这个问题 – 2016-04-05 09:34:53

相关问题