UICollectionView
後で読む
概要
Collection View は、複数のコンテンツを特定のレイアウトで順番に列挙するのに利用でき、複数のオブジェクトのやり取りで成り立っている。
https://gyazo.com/84829da9a84e00babc1171e4ebef77ce
View の再利用のライフサイクル
View がスクリーン上から消えると、削除される代わりに reuse queue に積まれる
新しいコンテンツがスクロールされて現れると、この queue から取り出される
Data Source オブジェクトは、CollectinoView に Cell や Supplementary View を提供する責務を持つが、直接 View を作成はしない
View から問い合わせがあった時、Data Souce は CollectionView のメソッドを利用して、適切な種類の View を deque する
View が CollectionView 上のコンテンツとして表示されてから削除されるまでのライフサイクルは、大体以下のようになっていると思われる。
3-1. queue に再利用できる Cell/View がない場合
3-2. queue に再利用できる Cell/View がある場合
再利用できるよう、Cell/View に前回の値が格納されていたら、それを削除する
上記処理が完了してから、Cell/View を返す
5. CollectionView 上に Cell/View が描画される
6. CollectionView 上から Cell/View が消える
iOS9 までは、prepareForReuse や collectionView(_:cellForItemAt:) の呼び出されるタイミングがセルが画面表示される直前だったため、セルの生成に時間がかかると処理が間に合わなくなる場合があったが、呼び出されるタイミングが早くなって改善されたようだ。同様に、セルの消失の時間も少し遅くなって、その代わりにメモリ使用量が増えたとのこと。
表示するデータのPrefetch
Cell prefetching
例えば、新しいセルの行をグリッドレイアウトに追加する場合など、CollectionView が大量のセルを同時に要求する場合、それらのセルが表示に必要とされる時点より前にリクエストされる
デフォルトではこれ
Data prefetching
セルの要求よりも前に、CollectionViewのデータ要件の通知を受け取ることができるメカニズムを提供する
セル内のコンテンツがネットワークリクエストのような時間のかかるものである場合に便利
prefetchDataSource プロパティに UICollectionViewDataSourcePrefetching プロトコルを実装したオブジェクトを渡すと、セルのデータを prefetch した時に通知を受け取ることができる
レイアウトのライフサイクル
http://www.plantuml.com/plantuml/png/SoWkIImgAStDuGhrTCxFoKbDBidCpmlBJ2rNqBLJG1VpIQpCBosnKYWeIYr8B4g5SBcuR860YoG3ab54dVFpIbBpIe8pgrAjC8snqSLfZBCxI8z6UMPAIOPEHcfcUaQ99ZdEoG7JZYKbHPb9fIMfnMxvHQuvgRb0DnLxvWK1rPFch6Xq2OJ9iLmEgNafmF060000.png
CollectionView のコンテンツ全体のサイズを返す
スクロール時に利用される
View の変化によりレイアウトが invalidate になり、レイアウト更新が必要となった際時の最初に呼び出される
デフォルトでは何もしない
CollectionView のサイズやそのアイテムの位置の計算に必要な計算を行うべきタイミング
CollectionView 上のある矩形範囲内の全てのアイテムおよびViewに適用すべき LayoutAttribute を返す
IndexPath で示される特定のアイテムの LayoutAttribute を返す
参考