UICollectionView 中 cellForItemAt 的滚动单元格问题

Posted

技术标签:

【中文标题】UICollectionView 中 cellForItemAt 的滚动单元格问题【英文标题】:Scrolling Cell Issue at cellForItemAt in UICollectionView 【发布时间】:2019-01-09 15:08:49 【问题描述】:

编辑: 问题解决了。我关注了一个关于如何从 LBTA 构建 Youtube 的 Youtube 教程。

我的 homeController 包含 4 个可以水平滚动的单元格。每个单元格(也是 UICollectionViewCell)都有不同的获取方法来从 Firebase 加载数据。

我有以下滚动代码:

// 在我的 setupCollectionView 中

if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout 
        flowLayout.scrollDirection = .horizontal
        flowLayout.minimumLineSpacing = 0
    

我也有:

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 
    let index = Int(targetContentOffset.pointee.x / view.frame.width)
    let indexPath = IndexPath(item: index, section: 0)
    menuBar.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally)
    setTitleForIndex(index: index)


我有一个附加到 collectionView 的菜单栏,菜单栏工作正常。但 UICollectionViewCell 没有。

当我通过左右滚动来测试它时,索引号到处都是。例如,当我滚动到第一个单元格时,它显示 2 或 3,或者有时什么也不显示。当我尝试在第一个单元格处向左滚动时,我仍然看到单元格编号发生了变化。

我想问一下在我的案例中识别单元格的适当方法是什么?请提供一些示例代码。谢谢。下图显示了我目前的状态。

【问题讨论】:

请提供您如何滑动单元格的代码以及委托回调。滑动手势是在 customCells 中还是来自 collectionView? 我没有滑动手势。我使用滚动方向 = .horizo​​ntal。请查看修改后的代码。 我没有看到您的编辑。另外,当你的意思是水平滚动时,你不应该说水平滑动 感谢您的评论。我刚刚将其更新为从滑动滚动 【参考方案1】:

您不需要重写 scrollViewWillEndDragging 方法。对于 collectionViews,您正在重用单元格。因此,当您滚动到屏幕外的单元格时,将调用 collectionViewCellForItemAt 方法。我假设您一次只显示 1 个单元格。因此,当显示新单元格时,您只需根据正在重复使用的单元格更改标题即可。

// Note I only used partial code from your method
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: numberViewCellId, for: indexPath) as! ThirdViewCell 
        cell.delegate = self
        setTitleForIndex(index: indexPath.Row)
        return cell
    

【讨论】:

它不起作用。我刚试过。不管怎么说,还是要谢谢你。是的,我一次显示一个单元格。当我使用您的方法时,我的 leftBarItem 在单元格上显示错误的标题。正如您在图像中看到的那样。它在第三个单元格上显示“附近”。 当您滚动到该单元格时,您的 print("Feed") 打印的数字是否正确? 否 它不打印正确的数字。这就是我现在遇到的情况 好吧,我现在很困惑。您正在使用其中包含 4 个项目的 collectionView。是否有超过 4 个项目?从您的屏幕截图中,您一次显示所有四个项目。你在哪里一次只显示一个单元格? 一次显示一个单元格。当我向左或向右滚动时,菜单栏将移动到正确的菜单项。白色区域用于从 Firebase 获取帖子。白色区域是嵌套在 4 个 UICollectionViewCells 中的 UICollectionView(可以垂直滚动)。 4 个单元格用于从 Firebase 加载不同类型的帖子。你可以把它想象成 Instagram。

以上是关于UICollectionView 中 cellForItemAt 的滚动单元格问题的主要内容,如果未能解决你的问题,请参考以下文章

执行 setCollectionViewLayout 时 UICollectionViewCel 中的布局看起来很奇怪

PFQueryTableViewController - CellForRowAtIndexPath 没有被调用/不工作

如何在 uicollectionview 标题中添加 uicollectionview

Swift UITableView:数据源分配问题

在 UICollectionView 中复制标注

我试图在我的 ViewController 上放置多个 UICollectionView,但模拟中只有一个 UICollectionView 正在运行