UICollectionViewLayout
#UICollectionView
概要
UICollectionViewLayout は、UICollectionView において、各 Collection のレイアウト情報を提供するための抽象規定クラス。UICollectionView は Collection の位置情報を決定するために、この抽象クラスに対して問合せを行う。UICollectionViewLayout は位置情報の提供を行うだけであり、実際にその位置情報を画面に反映させるのは UICollectionView の仕事になる。
UICollectionViewFlowLayout が UIKit に組み込みで存在する具象クラス。カスタムクラスを作る時にはこちらを参考にできる。
Collection の種類
Layout object 自体は Collection のレイアウト情報を提供するだけで Collection の View は生成しない。View の生成は CollectionView の datasource が行う。
Collection の種類には以下がある。
Cells
各セルは、Collection 内の単一のデータを表現する。CollectionView のコンテンツエリアにこのセルを並べるのが Layout job の主な仕事
Supplementary views
セルとは違い、ユーザに選択できない。CollectionView 全体やセクション内にヘッダーやフッターを実装したい時に使える。CollectionView の datasource によって作成された特定の item にひもづく
Decoration views
Supplementary views の一形態。Supplementary views と同様に選択はできない。違いは、データに紐づかないこと。例えば、スクリーン上に 5 item 毎に線を引く、等
これらは、UICollectionView.ElementCategory として enum で表現されている。
https://developer.apple.com/documentation/uikit/uicollectionview/elementcategory
サブクラス化について
Layout オブジェクトが実装すべきメソッドは以下。
prepare()
Layout object に現在のレイアウトの更新を伝える
layout が実行されるときに呼ばれる
各レイアウトの更新時に Collection View によって呼ばれ、レイアウトのための準備の機会を与えられる
デフォルト実装はなし
Collection View のサイズや位置を決定するための計算を行う
collectionViewContentSize
Collection View のコンテンツの幅と高さを返す
コンテンツ全体を収容する領域のサイズを返す
これで指定したサイズ分スクロールする
layoutAttributesForElements(in:)
特定の矩形内の全ての item の layout attribute を返す
デフォルト実装では null を返す
layoutAttributesForItem(at:)
特定の index path の item の layout attribute を返す
shouldInvalidateLayout(forBoundsChange:)
新たな範囲ではレイアウトの更新が必要かどうか?
デフォルト実装は false を返す
CollectionView の bounds が変更され、このメソッドが true を返すと、CollectionView は invalidateLayout(with:) メソッドを呼び出して Layout を無効化する
https://www.raywenderlich.com/4829472-uicollectionview-custom-layout-tutorial-pinterest