UICollectionview reloadData cause重新创建可见单元格

时间:2014-05-17 18:45:31

标签: ios uitableview uicollectionview reloaddata

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

那么,我怎样才能避免在UICollectionView中重新创建可见单元格。

5 个答案:

答案 0 :(得分:12)

您需要重新加载可见单元格,这不会导致在reloadData期间看到闪光:

[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];

答案 1 :(得分:5)

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

这是设计用于通知用户所有内容都刚刚更新......

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

答案 2 :(得分:1)

您可以尝试https://github.com/ba01ei/PSTImprovedCollectionView

使用此集合视图,当您调用reloadData时,如果单元格仍然可见,则将从队列返回相同的单元格(然后您可以检查附加到单元格的数据模型并决定是否重新渲染)< / p>

答案 3 :(得分:1)

Swift版本:

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

答案 4 :(得分:1)

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

class MyFlowLayout: UICollectionViewFlowLayout {

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

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