A Tour of UICollectionView - WWDC 2018 - Videos - Apple Developer
トピック
Layouts
Updates
Animations
Layout
DataSouce
Delegate
視覚情報(レイアウト)をコンテンツとは別に抽象化する
bounds, center, frame
これらの三つってよく見かけるけど違いはなんだろう mactkg.icon
レイアウトを変えるときはInvalidation mechanismを使う
端末が回転した時に呼ばれることもある
Abstract Classなのでサブクラスを使う
UICollectionViewDelegateFlowLayout < UICollectionViewDelegate
Line-based layout
Horizontal
https://gyazo.com/3543d4a817a2f86ed2521cd18a151e4b
Vertical
https://gyazo.com/8ed0477ac2685df39640af805fb1c81d
カスタムできる値(Delegate使う)
Line Spacing
Inter-Item Spacing
prepare()
レイアウトが無効化された時に再度呼ばれる
レイアウトが無効化されるのは、boundsが変更される時など
DataSouce
Provide Content
cellForItemAt
Section and Item Counts
numberOfSection
numberOfItemsInSection
Delegate
Optional
UICollectionViewはUIScrollView
Highlighting, Sectionも取れる
willDisplayItem / didEndDisplayingItem
-.icon
カスタムレイアウトを作る
Providing Content Size
これはUICollectionViewに伝えるやつ
open var collectionViewContentSize
Providing Layout Attributes
何を表示するかを渡す
func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?
geometric region
func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
パフォーマンスが重要
Preparing the Layout
invalidateLayoutする度に呼ばれる
キャッシュ保存したいレイアウト属性とか、コンテンツのサイズを決めるタイミング
↑で返す値をここで計算しておく
Handling Bounds Changes in Your Custom Layout
UIScrollView
func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool
スクロール中や絵文字を使った時に呼ばれる
カスタムモザイクの実装
UICollectionViewLayoutを使ってみる
まずはprepare()実装するぞ!
func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? が重かった
UIScrollViewのこの部分を描画したいんだけど、どのElementを取ってきたらいい?と聞かれている
ソート済のlayoutAttributesを二分探索して高速に見つけるようにする アニメーションの実装
performBatchUpdate
更新や削除、アニメーションなどを同時に行ないたい時に使う
UITableViewでも使える
performBatchUpdatesでエラー
collectionViewと同時にdataSouceも更新しないといけない
collectionViewの順番を変えるときは特に考慮しなくて良いが、dataSouceは気をつける必要がある
https://gyazo.com/357be00e487be0c9e20239de922e6994
Deletes are processed before inserts in batch operations. This means the indexes for the deletions are processed relative to the indexes of the collection view’s state before the batch operation, and the indexes for the insertions are processed relative to the indexes of the state after all the deletions in the batch operation.
Deleteが先に来る記述
原則
移動は削除と挿入に分ける
全ての削除と挿入をまとめる
IndexPath上で削除を降順で処理する
IndexPath上で挿入を昇順で処理する
reloadData
アニメーションしない。特別な時だけ使う
The Sledgehammer
https://gyazo.com/e30ee2f9373f6e504a1b7ae0a61d45f4
UIView.performWithoutAnimation
データソースをいじってもアニメーションしないようにできる
PerformBatchUpdatesはDataSourceを先に調整しておく必要があるので、performWithoutAnimationを使う
If the collection view's layout is not up to date before you call this method, a reload may occur. To avoid problems, you should update your data model inside the updates block or ensure the layout is updated before you call performBatchUpdates(_:completion:).