2016-02-23 74 views
1

我面临一个奇怪的情况,如果UICollectionView第一次加载了0个单元格,它会改变大小。如果第一次加载超过0个单元格,它会保持正确的大小。这种行为对我来说没有任何意义,我不知道如何纠正它。UICollectionView空时改变大小

我正在使用分页集合视图,类似于描述的内容here

这意味着,我设置的单元尺寸是相同的集合视图的大小:

- (CGSize)collectionView:(UICollectionView *)collectionView 
        layout:(UICollectionViewLayout *)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return collectionView.bounds.size; 
} 

奇怪的是我收到此错误信息:

2016-02-23 14:27:10.574 the behavior of the UICollectionViewFlowLayout is not defined because: 
2016-02-23 14:27:10.574 the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values. 
2016-02-23 14:27:10.575 The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fa90ac86d30>, and it is attached to <UICollectionView: 0x7fa90c84da00; frame = (0 0; 414 150); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fa90ac88450>; layer = <CALayer: 0x7fa90ac85b70>; contentOffset: {0, 0}; contentSize: {828, 187}> collection view layout: <UICollectionViewFlowLayout: 0x7fa90ac86d30>. 
2016-02-23 14:27:10.575 Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger. 

基本上是告诉我,单元格的高度大于集合视图的高度,这实际上没有任何意义,因为我将单元格的大小设置为与集合视图相同。

在我看来,集合视图正在改变它的高度,取决于它是否为空,这对我来说没有任何意义。有谁知道我可以如何解决这个问题,或对我如何解决它有任何建议?

UPDATE:

好像我没有完全理解的问题,当我问到这个问题。我认为这个问题是由于我第一次加载集合视图时没有任何单元格。所以我认为一个简单的解决方案是在加载内容时放置一个空的占位符单元格。不幸的是,当我重新加载数据时,单元格的大小仍然很大。所以问题似乎是,第一次加载集合视图时大小是正确的,并且在任何后续重新加载时,大小都会变得不正确。

+0

uicollectionview的contentinset怎么样? –

回答

0

好像我找到了解决方案:通过设置布局estimatedItemSize我摆脱了这个问题。

flowLayout.estimatedItemSize = collectionView.bounds.size; 

编辑:当单元格的宽度在屏幕上适合此解决方案的工作原理。否则,细胞将占用尽可能多的空间以充分显示其内容,并且如果内容太大,它将比屏幕更宽。由于我有动态内容,这是不可接受的。这种解决方案可能适用于类似情况下的其他人,所以我保留这个答案,但我将不得不寻找更好的解决方案。

+0

这个解决方案似乎已经搞砸了单元格的宽度。他们现在太宽了,而不是太高。所以现在我需要找到一种方法来解决这个问题。 –

0

我发现调整收集视图的原因。它对UIPageControl有一个约束,当0或1页时会消失。我的解决方案是将hidesForSinglePage属性设置为NO,并在没有内容时使用占位符单元格。

另一种解决办法是将约束限制在超级视图的底部而不是UIPageControl。这样,页面控件就可以消失。我希望页面控制在任何时候都在那里,但如果你不这样做,这个解决方案将是你的。或者,您可以根据页面控件是否可见来调整超级视图大小。