【问题标题】:How to be notified of UICollectionView frame changes如何通知 UICollectionView 框架更改
【发布时间】:2014-07-20 20:14:30
【问题描述】:

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

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

目前的解决方案:
为了解决这个问题,我直到viewDidAppear 才更改collectionViewLayout。这确实会导致获得正确的大小。但是,直到使用默认 Flow 布局显示集合视图之后才会这样做,因此所有单元格都已以不同的布局呈现,然后我更改了布局并导致单元格重新呈现。虽然这几乎没有引起注意,因为它发生得如此之快,但显然不是一个好的解决方案。

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

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

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

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

请注意,我无需担心未来的集合视图大小更改,因为布局将失效并在边界更改时重新渲染。

【问题讨论】:

  • 你试过在viewDidLayoutSubviews做吗?
  • viewDidLayoutSubviews被调用了4次,第一次调用frame是Interface Builder中设置的大小,第二次是0 x 0,第三次和第四次调用的值都是正确的。也许没关系,我可以将这些值与 IB 中的值进行比较,并且只在适当的时候设置布局。我会尝试,但也许有更好的解决方案。
  • @SylvainGuillopé 随意添加这个作为答案,如果我在viewDidLayoutSubviews 中实现大小比较,它对我来说效果很好。

标签: ios swift uicollectionview ios8 uicollectionviewlayout


【解决方案1】:

您可以尝试改用 viewDidLayoutSubviews,因为它在 viewDidAppear: 之前被调用,这样您就有机会获得正确的帧值。

文档中的注释:

但是,调用此方法并不表示 视图的子视图的个别布局已调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2012-10-24
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多