layoutSubviews 在添加到 UICollectionView 时冻结应用程序
layoutSubviews freezes the app when added to UICollectionView
我希望在我的自定义 UICollectionView 达到其大小时收到通知。它是从 xib 创建的。
我添加了以下功能:
override func layoutSubviews() {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.itemSize = CGSize(width: segmentWidth(), height: segmentHeight())
self.setCollectionViewLayout(layout, animated: false)
}
这个函数被无休止地调用。我究竟做错了什么?
当集合视图发生变化时,您不需要像这样更新布局。
事实上,因为您使用的是 Flow Layout,所以应该有一种更简单的方法来让它执行您想要的操作。
我认为 segmentHeight
和 segmentWidth
是依赖于集合视图大小的函数,这就是您需要重新计算它们的原因?
如果是这样,那么您应该可以使用 UICollectionViewFlowLayout
的 delegate
功能。
首先使用新协议更新您的视图控制器...
class MyViewController: UICollectionViewDelegateFlowLayout
这将使您的视图控制器充当流布局的委托。
并使用方法...
func collectionView(UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize {
return CGSize(width: segmentWidth(), height: segmentHeight())
}
应该就可以了。
如果我遗漏了什么,请告诉我,但你应该从中得到你想要的一切。
之后只需删除 layoutSubviews
方法,它就会按照您的意愿执行。
我希望在我的自定义 UICollectionView 达到其大小时收到通知。它是从 xib 创建的。 我添加了以下功能:
override func layoutSubviews() {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.itemSize = CGSize(width: segmentWidth(), height: segmentHeight())
self.setCollectionViewLayout(layout, animated: false)
}
这个函数被无休止地调用。我究竟做错了什么?
当集合视图发生变化时,您不需要像这样更新布局。
事实上,因为您使用的是 Flow Layout,所以应该有一种更简单的方法来让它执行您想要的操作。
我认为 segmentHeight
和 segmentWidth
是依赖于集合视图大小的函数,这就是您需要重新计算它们的原因?
如果是这样,那么您应该可以使用 UICollectionViewFlowLayout
的 delegate
功能。
首先使用新协议更新您的视图控制器...
class MyViewController: UICollectionViewDelegateFlowLayout
这将使您的视图控制器充当流布局的委托。
并使用方法...
func collectionView(UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize {
return CGSize(width: segmentWidth(), height: segmentHeight())
}
应该就可以了。
如果我遗漏了什么,请告诉我,但你应该从中得到你想要的一切。
之后只需删除 layoutSubviews
方法,它就会按照您的意愿执行。