【问题标题】:UICollectionView flow layout not definedUICollectionView 流布局未定义
【发布时间】:2021-01-24 22:46:39
【问题描述】:

我有一个水平滚动的UICollectionView 使用具有其委托和数据源集的流布局。它的高度为 50,并使用自动布局固定在我的视图中。不幸的是,它从不显示并且总是给出以下错误:

2020-10-09 21:30:08.687110+0100 MyApp[8679:1601772] UICollectionViewFlowLayout 的行为未定义,因为: 2020-10-09 21:30:08.687428+0100 MyApp[8679:1601772] 项目高度必须小于 UICollectionView 的高度减去部分插入顶部和底部值,减去内容插入顶部和底部值。 2020-10-09 21:30:08.687743+0100 MyApp[8679:1601772] 请检查代理返回的值。 2020-10-09 21:30:08.688641+0100 MyApp[8679:1601772] 相关的 UICollectionViewFlowLayout 实例为 ,并附加到 ;层 = ;内容偏移:{0, 0};内容大小:{1081.6666666666667, 90}; adjustedContentInset: {0, 0, 0, 0}> 集合视图布局:。 2020-10-09 21:30:08.688943+0100 MyApp[8679:1601772] 在 UICollectionViewFlowLayoutBreakForInvalidSizes 处创建符号断点以在调试器中捕获此问题。

我注意到它说 contentSize 是 {1081.6666666666667, 90} 但它实际上只调用 numberOfSectionsnumberOfItemsInSection 委托方法。其他的没有被调用,UICollectionViewDelegateFlowLayout 的大小调整方法也没有。为什么会这样以及如何在不实际调用数据源/委托方法的情况下获得 contentSize?如果我将自动布局高度设置为 50 到 90 没有区别。

我的 collectionView 设置在情节提要中。我已经注册了我的单元格并设置了估计的流布局大小,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.register(
        UINib(nibName: "VideoClipCell", bundle: nil),
        forCellWithReuseIdentifier: "VideoClipCell"
    )
    if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        flowLayout.estimatedItemSize = CGSize(width: 30, height: 50)
    }
}

这些是数据源/流委托方法:

extension EditingViewController : UICollectionViewDataSource {
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(
            withReuseIdentifier: "VideoClipCell", for: indexPath) as? VideoClipCell else {
            return UICollectionViewCell()
        }
        return cell
    }
}

extension EditingViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(
        _ collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 100, height: 50)
    }
}

【问题讨论】:

    标签: ios swift uicollectionview


    【解决方案1】:

    你能显示你的 UICollectionView 的 init func,我猜你没有将 UICollectionView 委托设置为 self,并且布局 itemsize 高度大于 90

    【讨论】:

    • 它是通过情节提要初始化的。正如我所说,我已将委托设置为 self.我在流委托函数中将项目大小返回为CGSize(width: 100, height: 50),但它永远不会被调用。
    【解决方案2】:

    您的单元格中有UIImageView 吗?这可能就是您收到 1081.6666666666667 的内容大小的原因。

    您可能不想要自行调整大小的单元格,因此请关闭情节提要中的“估计大小”。否则,您的收藏视图将无法读取 sizeForItemAt 中的内容。

    【讨论】:

    • 我刚刚从我的单元格中删除了所有内容,以确保这不是问题并且仍然存在同样的问题
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多