问题:
如何在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布局中显示单元格。这需要一些方法来了解集合视图大小在屏幕上呈现之前的大小,这可能是不可能的(或者至少不准确)。
解决此问题的最佳方法是什么?
请注意,我不需要担心将来的集合视图大小更改,因为布局将被取消并在边界更改时重新呈现。
答案 0 :(得分:1)
您可以尝试使用viewDidLayoutSubviews
,因为它在viewDidAppear:
之前被调用,因此您可以在此时获得正确的帧值。
请注意文档:
但是,这种方法被调用并不表示 视图的子视图的各个布局已经过调整。