Ios UICollectionView空时更改大小

Ios UICollectionView空时更改大小,ios,autolayout,uicollectionview,uistoryboard,nib,Ios,Autolayout,Uicollectionview,Uistoryboard,Nib,我面临着一种奇怪的情况,UICollectionView在第一次加载0个单元格时会改变大小。如果第一次加载的单元格超过0个,则会保持正确的大小。这种行为对我来说毫无意义,我不知道如何纠正它 我使用的是分页的集合视图,类似于前面所描述的 这意味着我将单元格大小设置为与集合视图的大小相同: - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayo

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

我使用的是分页的集合视图,类似于前面所描述的

这意味着我将单元格大小设置为与集合视图的大小相同:

- (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.
2016-02-23 14:27:10.574未定义UICollectionViewFlowLayout的行为,因为:
2016-02-23 14:27:10.574项目高度必须小于UICollectionView的高度减去部分插入的顶部和底部值,再减去内容插入的顶部和底部值。
2016-02-23 14:27:10.575相关的UICollectionViewFlowLayout实例为,并附加到集合视图布局:。
2016-02-23 14:27:10.575在UICollectionViewFlowLayoutBreakForInvalidSizes处创建一个符号断点,以便在调试器中捕获该断点。
基本上告诉我单元格的高度大于集合视图的高度,这没有任何意义,因为我将单元格的大小设置为与集合视图相同

在我看来,集合视图似乎在根据它是否为空而改变其高度,这对我来说没有任何意义。有人知道我如何解决这个问题,或者对我如何解决这个问题有什么建议吗

更新:


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

似乎我找到了解决方案:通过在布局上设置
estimatedItemSize
,我消除了这个问题

flowLayout.estimatedItemSize = collectionView.bounds.size;

编辑:当单元格宽度适合屏幕时,此解决方案有效。否则,单元格将占据完全显示其内容所需的空间,如果内容太大,单元格将比屏幕更宽。因为我有动态内容,这是不可接受的。在类似情况下,此解决方案可能适用于其他人,因此我保留此答案,但我必须找到更好的解决方案。

似乎我找到了解决方案:通过在布局上设置
estimatedItemSize
,我解决了此问题

flowLayout.estimatedItemSize = collectionView.bounds.size;

编辑:当单元格宽度适合屏幕时,此解决方案有效。否则,单元格将占据完全显示其内容所需的空间,如果内容太大,单元格将比屏幕更宽。因为我有动态内容,这是不可接受的。在类似情况下,此解决方案可能适用于其他人,因此我保留此答案,但我必须找到更好的解决方案。

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


另一个解决方案是将约束设置到超级视图的底部,而不是
UIPageControl
。这样,页面控件就可以消失了。我希望页面控件始终在那里,但如果您不在,这个解决方案将是适合您的。或者,您可以根据页面控件是否可见来调整超级视图的大小。

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


另一个解决方案是将约束设置到超级视图的底部,而不是
UIPageControl
。这样,页面控件就可以消失了。我希望页面控件始终在那里,但如果您不在,这个解决方案将是适合您的。或者,您可以根据页面控件是否可见来调整super view的大小。

uicollectionview的contentinset如何?uicollectionview的contentinset如何?此解决方案似乎已经扭曲了单元格的宽度。它们现在太宽而不是太高。所以现在我需要找到一种方法来解决这个问题。这个解决方案似乎把细胞的宽度搞砸了。它们现在太宽而不是太高。所以现在我需要找到一种方法来解决这个问题。