【问题标题】:UICollection view reloadData cause recreate visible cellUICollectionview reloadData 导致重新创建可见单元格
【发布时间】:2014-07-06 01:33:08
【问题描述】:

当我调用 UICollectionView 的 reloadData 方法时,它会导致所有可见单元格闪烁。我发现这样做的原因是所有可见单元格的重新创建,而 UITableView 在重新加载数据后返回可见单元格中的 –tableView:cellForRowAtIndexPath: 方法。

那么,如何避免重新创建 UICollectionView 中的可见单元格。

【问题讨论】:

    标签: ios uitableview uicollectionview reloaddata


    【解决方案1】:

    在表格或集合视图上调用reloadData 将重新创建(如果可能的话,出列)所有(可见)单元格并刷新有关行/项目计数和视图内容高度的信息。因此,您将始终看到“眨眼”,因为它是动画的。

    这是为了通知用户所有内容都刚刚更新...

    为避免动画,请勿调用reloadData。相反,使用visibleCells 来获取屏幕上当前存在的所有单元格并直接更新其内容。

    【讨论】:

    • 当我在tableView:cellForRowAtIndexPath: 中为 tableView 调用 reloadData 时,我得到了带有先前加载数据的可见单元格。因此,例如,如果我有 imageView 并且图像不更改,我不会更新它,从而避免闪烁。但是对于 reloadData 之后的集合视图,我得到了全新的单元格 - 当前不可见的单元格与之前加载的数据。
    • 您是否“获得”可重用单元格并不特定于表格或集合视图,它与您所做的滚动或之前发生的重新加载更相关。而且您应该始终重新配置单元格-您怎么知道它以前用于哪一行...
    • collectionView 不滚动时调用 reloadData。没有必要知道它以前用于哪一行。只需保存当前加载到单元格中的图像的图像名称,如果它在重新加载后匹配(对于 tableView,如果单元格数据源没有改变 - 这是真的)什么都不做。
    【解决方案2】:

    你可以试试https://github.com/ba01ei/PSTImprovedCollectionView

    有了这个collection view,当你调用reloadData的时候,如果一个cell仍然可见,就会从队列中返回同一个cell(然后你可以检查cell附加的数据模型,决定是否重新渲染)

    【讨论】:

      【解决方案3】:

      您需要重新加载可见单元格,这不会导致reloadData期间出现闪烁:

      [myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];

      【讨论】:

      • 为我工作。谢谢:)
      • 我仍然看到一瞬间的闪烁,但它比 reloadData 少得多。
      【解决方案4】:

      Swift 版本:

      if let indexPaths = collectionView?.indexPathsForVisibleItems {
          collectionView?.reloadItems(at: indexPaths)
      }
      

      【讨论】:

        【解决方案5】:

        您可以简单地创建自己的流布局并将 alpha 设置为初始布局属性,例如

        class MyFlowLayout: UICollectionViewFlowLayout {
        
            override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
                let attr = layoutAttributesForItem(at: itemIndexPath)
                attr?.alpha = 1
                return attr
            }
        }
        

        这是必要的,因为默认情况下 alpha 为 0,如果重新创建单元格 - 您会看到闪烁。

        【讨论】:

        • 这听起来像是正确的解决方案,但我似乎从来没有调用过这种方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        相关资源
        最近更新 更多