web-dev-qa-db-ja.com

UICollectionview reloadDataにより可視セルが再作成されます

UICollectionViewのreloadDataメソッドを呼び出すと、表示されているすべてのセルが点滅します。 UITableViewが可視セルを返す一方で、この理由はすべての可視セルの再作成であることがわかりました – tableView:cellForRowAtIndexPath: データをリロードした後のメソッド。

したがって、UICollectionViewで可視セルの再作成を回避するにはどうすればよいですか。

19
abagmut

可視セルを再ロードする必要があります。これにより、reloadData中にフラッシュが発生しなくなります。

[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];

13
Adam W. Dennis

テーブルまたはコレクションビューでreloadDataを呼び出すと、すべての(表示可能な)セルが再作成(可能な場合はデキュー)され、行/アイテム数とビューコンテンツの高さに関する情報が更新されます。したがって、アニメーション化されているため、常に「点滅」が表示されます。

これは、すべてが更新されたことをユーザーに通知するための仕様です...

アニメーションを回避するには、reloadDataを呼び出さないでください。代わりに、visibleCellsを使用して、現在画面に存在するすべてのセルを取得し、その内容を直接更新します。

5
Wain

Swiftバージョン:

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

独自のフローレイアウトを作成し、アルファを初期レイアウト属性に設定するだけです。

class MyFlowLayout: UICollectionViewFlowLayout {

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

デフォルトではアルファが0であり、セルが再作成されると点滅するので、これは必要です。

2

あなたは試すことができます https://github.com/ba01ei/PSTImprovedCollectionView

このコレクションビューでは、reloadDataを呼び出すと、セルがまだ表示されている場合、同じセルがキューから返されます(セルに接続されているデータモデルを確認して、再レンダリングするかどうかを決定できます)。

1
Bao Lei