UICollection view reloadData cause重建可见单元格



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

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

您需要重新加载可见单元格,这将不会导致在reloadData:

中看到的闪光。

[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];

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

这是为了通知用户一切都刚刚更新…

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

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

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

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

Swift版本:

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

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

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

最新更新