Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获得UICollectionView框架更改的通知_Ios_Swift_Uicollectionview_Ios8_Uicollectionviewlayout - Fatal编程技术网

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
中实现大小的比较,这对我来说效果很好。