Ios 如何获得UICollectionView框架更改的通知
问题:Ios 如何获得UICollectionView框架更改的通知,ios,swift,uicollectionview,ios8,uicollectionviewlayout,Ios,Swift,Uicollectionview,Ios8,Uicollectionviewlayout,问题: 当我的UICollectionView的框架发生更改时,如何通知我,以便在发生这种情况时运行一些代码?然而,我想知道这是否是解决问题的最佳办法 问题: 我已经创建了自己的UICollectionViewLayout,在布局单元格之前需要知道集合视图的框架大小。问题是,当我在viewdiload中将其collectionViewLayout属性设置为我的自定义布局时,集合视图还没有出现在屏幕上。因此,当运行布局代码时,它为collectionView.frame.size获取的值是Inte
当我的
UICollectionView
的框架发生更改时,如何通知我,以便在发生这种情况时运行一些代码?然而,我想知道这是否是解决问题的最佳办法
问题:我已经创建了自己的
UICollectionViewLayout
,在布局单元格之前需要知道集合视图的框架大小。问题是,当我在viewdiload
中将其collectionViewLayout
属性设置为我的自定义布局时,集合视图还没有出现在屏幕上。因此,当运行布局代码时,它为collectionView.frame.size
获取的值是Interface Builder中定义的宽度和高度,当集合视图由于自动布局约束出现在屏幕上时,该值会发生变化。这会导致自定义布局在函数collectionViewContentSize
中返回不正确的大小
当前解决方案:为了解决这个问题,我不会更改
collectionViewLayout
,直到viewdid出现。这确实会导致获得正确的尺寸。但是,在使用默认流布局显示集合视图之前,不会执行此操作,因此所有单元格都已在不同的布局中渲染,然后我更改布局并使单元格重新渲染。虽然这几乎不明显,因为它发生得太快,但显然不是一个好的解决方案
更好的问题:
当UICollectionView
帧的大小发生变化时,是否可能收到通知?如果是这样的话,也许我可以在这种情况发生时设置布局,这应该很快就会发生,以防止使用默认流布局显示单元格
如果这是不可能的,一个看似糟糕但稍好的解决方案可能是在viewdideappease
中设置新布局之前不显示任何单元格。这将阻止流布局呈现,但会在短时间内显示一个空白UI
另一个选项是将CGSize
传递给layout类,而不是仅仅访问collectionView.frame.size
,这样做时,我仍然可以在viewDidLoad
中设置自定义布局,并防止在Flow layout中显示单元格。在屏幕上呈现集合视图之前,需要知道集合视图的大小,这可能是不可能的(或者至少是不准确的)
解决这个问题的最佳方法是什么
请注意,我不需要担心将来集合视图大小的更改,因为布局将失效并在边界更改时重新呈现。您可以尝试使用它,因为它在视图出现之前被调用:
,因此您有可能在该点获得正确的帧值
文件中的注释:
但是,调用此方法并不表示
已调整视图子视图的各个布局
您是否尝试过在viewDidLayoutSubviews
中执行此操作?viewDidLayoutSubviews
调用了4次,第一次调用的帧是Interface Builder中设置的大小,第二次调用的帧是0 x 0,第三次和第四次调用的值正确。也许这样就可以了,我可以将这些值与IB中的值进行比较,并且只在适当的时候设置布局。我会试试看,但也许有更好的解决方案。@SylvainGuillopé可以随意添加这个作为答案,如果我在viewDidLayoutSubviews
中实现大小的比较,这对我来说效果很好。