UICollectionViewのreloadDataメソッドを呼び出すと、表示されているすべてのセルが点滅します。 UITableViewが可視セルを返す一方で、この理由はすべての可視セルの再作成であることがわかりました – tableView:cellForRowAtIndexPath: データをリロードした後のメソッド。
したがって、UICollectionViewで可視セルの再作成を回避するにはどうすればよいですか。
可視セルを再ロードする必要があります。これにより、reloadData
中にフラッシュが発生しなくなります。
[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];
テーブルまたはコレクションビューでreloadData
を呼び出すと、すべての(表示可能な)セルが再作成(可能な場合はデキュー)され、行/アイテム数とビューコンテンツの高さに関する情報が更新されます。したがって、アニメーション化されているため、常に「点滅」が表示されます。
これは、すべてが更新されたことをユーザーに通知するための仕様です...
アニメーションを回避するには、reloadData
を呼び出さないでください。代わりに、visibleCells
を使用して、現在画面に存在するすべてのセルを取得し、その内容を直接更新します。
Swiftバージョン:
if let indexPath = collectionView?.indexPathsForVisibleItems {
collectionView?.reloadItems(at: indexPath)
}
独自のフローレイアウトを作成し、アルファを初期レイアウト属性に設定するだけです。
class MyFlowLayout: UICollectionViewFlowLayout {
override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attr = layoutAttributesForItem(at: itemIndexPath)
attr?.alpha = 1
return attr
}
}
デフォルトではアルファが0であり、セルが再作成されると点滅するので、これは必要です。
あなたは試すことができます https://github.com/ba01ei/PSTImprovedCollectionView
このコレクションビューでは、reloadDataを呼び出すと、セルがまだ表示されている場合、同じセルがキューから返されます(セルに接続されているデータモデルを確認して、再レンダリングするかどうかを決定できます)。