如何通知UICollectionView框架更改

时间:2014-07-20 20:14:30

标签: ios swift uicollectionview ios8 uicollectionviewlayout

问题:
如何在UICollectionView的框架发生更改时通知我,以便在发生这种情况时运行某些代码?但是,我想知道这是否是解决问题的最佳方案。

问题:
我创建了自己的UICollectionViewLayout,它需要在布置单元格之前知道集合视图的框架大小。问题是,当我在collectionViewLayout中将viewDidLoad属性设置为我的自定义布局时,集合视图不会出现在屏幕上。因此,当运行布局代码时,它为collectionView.frame.size获取的值是Interface Builder中定义的宽度和高度,当集合视图由于Autolayout约束而出现在屏幕上时会更改。这会导致自定义布局在函数collectionViewContentSize中返回不正确的大小。

目前的解决方案:
要解决此问题,我不会将collectionViewLayout更改为viewDidAppear。这确实导致获得正确的大小。但是,直到使用默认的Flow布局显示集合视图之后才会执行此操作,因此所有单元格都以不同的布局呈现,然后我更改布局并导致单元格被重新渲染。虽然这几乎不可察觉,因为它发生得如此之快,但它显然不是一个好的解决方案。

更好的问题:
UICollectionView帧的大小发生变化时,是否可以通知?如果是这样,也许我可以在发生这种情况时设置布局,这应该很快就会发生,以防止使用默认的Flow布局显示单元格。

如果不可能,那么在viewDidAppear中设置新布局之前,看似不好但稍好一点的解决方案可能是不显示任何单元格。这样可以防止Flow布局呈现,但会在短时间内显示空白UI。

另一种选择是将CGSize传递给布局类而不是仅仅访问collectionView.frame.size,这样做我仍然可以在viewDidLoad中设置自定义布局并阻止在Flow布局中显示单元格。这需要一些方法来了解集合视图大小在屏幕上呈现之前的大小,这可能是不可能的(或者至少不准确)。

解决此问题的最佳方法是什么?

请注意,我不需要担心将来的集合视图大小更改,因为布局将被取消并在边界更改时重新呈现。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用viewDidLayoutSubviews,因为它在viewDidAppear:之前被调用,因此您可以在此时获得正确的帧值。

请注意文档:

  

但是,这种方法被调用并不表示   视图的子视图的各个布局已经过调整。