如何区分UICollectionViewLayout prepareLayout(iOS 6)的原因?

时间:2013-12-27 02:48:04

标签: ios iphone objective-c uicollectionview uicollectionviewlayout

AFAIK,导致UICollectionViewLayout重启布局过程的原因是:

  • UICollectionView的框架更改
  • UICollectionView重新加载数据
  • UICollectionView插入/删除项目
  • UICollectionView的绑定更改(如果shouldInvalidateLayoutForBoundsChange返回YES)

在我的自定义布局实现中,我想更改某些项目的UICollectionViewLayoutAttributes作为绑定更改(将标题添加到顶部,如UITableView,动画项目输入/输出.etc)。

问题在于,无论出于何种原因,UICollectionView总是调用其布局对象的prepareLayout方法(包含繁重的布局计算)并且使得滚动不稳定。

如果原因是UICollectionView的约束更改,我会选择退出布局计算的解决方案。

如何查看prepareLayout来电的原因?

1 个答案:

答案 0 :(得分:2)

我在shouldInvalidateLayoutForBoundsChange:设置了一个标志,所以我知道在发生这种情况时不会重新计算所有内容(在每一帧......)。

您可以在调用prepareForAnimatedBoundsChange:时设置另一个标志,这在插入新项目或集合视图的边界发生更改时会发生。然后,您可以知道由于滚动或由于您在shouldInvalidateLayoutForBoundsChange:中设置的标记而调整边界是否已更改。

但是,您不必过于担心为什么必须准备布局,因为在大多数情况下您应该完全重新计算它。在我的项目中,我在prepareLayout中执行不同操作的唯一情况是失效是由滚动引起的。