Ios layoutSubviews在添加到UICollectionView时冻结应用程序

Ios layoutSubviews在添加到UICollectionView时冻结应用程序,ios,swift,uicollectionview,uicollectionviewflowlayout,Ios,Swift,Uicollectionview,Uicollectionviewflowlayout,我希望在自定义UICollectionView获得其大小时收到通知。它是从xib创建的。 我添加了以下功能: override func layoutSubviews() { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .vertical layout.itemSize = CGSize(width: segmentWidth(), height: segmentHeight())

我希望在自定义UICollectionView获得其大小时收到通知。它是从xib创建的。 我添加了以下功能:

override func layoutSubviews() {
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical
    layout.itemSize = CGSize(width: segmentWidth(), height: segmentHeight())
    self.setCollectionViewLayout(layout, animated: false)
}

这个函数被无休止地调用。我做错了什么

当集合视图更改时,不需要像这样更新布局

事实上,因为您使用的是流布局,所以应该有一种更简单的方法让它做您想要的事情

我假设
segmentHeight
segmentWidth
是依赖于集合视图大小的函数,这就是您需要重新计算它们的原因

如果是这样,您应该能够使用
UICollectionViewFlowLayout
委派功能

首先用新协议更新视图控制器

class MyViewController: UICollectionViewDelegateFlowLayout
这样,视图控制器就可以充当流布局的代理

并使用该方法

func collectionView(UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize {
    return CGSize(width: segmentWidth(), height: segmentHeight())
}
应该是这样

如果我错过了什么,请告诉我,但你应该从中得到你想要的一切


之后,只需删除
layoutSubviews
方法,它就可以按照您的要求执行。

请更正您的代码,您有两个函数声明,可能是一个typo@CZ54谢谢Done@Luda将编辑问题。对不起,刚才我的电话里有一个简短的回答:D