【问题标题】:layoutSubviews freezes the app when added to UICollectionViewlayoutSubviews 添加到 UICollectionView 时冻结应用程序
【发布时间】:2018-06-13 09:37:31
【问题描述】:

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

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

这个函数被无限调用。我究竟做错了什么?

【问题讨论】:

  • 请更正您的代码,您有 2 个函数声明,可能是错字
  • @CZ54 谢谢。完成

标签: ios swift uicollectionview uicollectionviewflowlayout


【解决方案1】:

当集合视图发生变化时,您不需要像这样更新布局。

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

我认为segmentHeightsegmentWidth 是依赖于集合视图大小的函数,这就是你需要重新计算它们的原因?

如果是这样,那么您应该能够使用UICollectionViewFlowLayoutdelegate 函数。

首先使用新协议更新您的视图控制器...

class MyViewController: UICollectionViewDelegateFlowLayout

这将使您的视图控制器充当流布局的委托。

并使用方法...

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

应该就是这样。

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

之后只需删除 layoutSubviews 方法,它应该会按照您的意愿执行。

【讨论】:

  • @Luda 将编辑问题。抱歉,刚刚用我的手机快速回复了:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多