【Swift】sectionHeadersPinToVisibleBoundsを設定するとスクロールがカクつく不具合修正

こんにちは。
なんだかプルリクタイトルみたいになってしまいましたが、CollectionViewでsectionHeadersPinToVisibleBoundsを設定するとスクロールがカクつく不具合があったので修正メモです。

sectionHeadersPinToVisibleBoundsとは?

CollectionViewにSupplementaryViewを利用してヘッダーを用意している時、普通ならスクロールした時にヘッダーも追従してきますが、それを画面上にフロートさせたい場合に

sectionHeadersPinToVisibleBounds  = true

を設定することで実現できます。

スクロールすると一瞬位置がジャンプする

一定の位置までスクロールすると座標がジャンプしてしまい動作がカクついてしまう不具合がありました。
原因を特定せず、色々試しているうちに不具合出なくなった感じなので究明できていませんが、ざっと調べてみるとestimatedSizeやself-sizingが影響していそうな、、

ともあれ以下改善策です。

改善策

CompositionalLayoutを利用する

バグの段階でCollectionViewFlowLayoutを利用している場合に限りますが、CompositionalLayoutに移行することで解消できました。
ただiOS12以下を担保している場合はバージョン分けをしないといけないし、結局12以下は改善されていないので利用は△って感じです。

compositionalLayoutの使い方はこちらで説明しています。

【Swift】iOS13のCollectionView、CompositionalLayoutsでモダンにレイアウトする
【Swift】Compositinal Layouts を複数の型に適応させる方法
【Swift】CompotionalLayouts でセクションごとのcollectionView/cellにアクセスする方法

固定サイズでレイアウトする

self-sizingを撤廃、estimatedItemSize = .automaticを撤廃、sizeForItemAtでサイズ計算をしレイアウトすることで解消しました。
やはり結局はDynamic SizeでestimatedSizeを設定し、それが上手いこと計算されていないが故の不具合っぽいです。
これだとiOS12以下も担保できます。

結論

上記を試してみてください。さすれば光が見えるかもしれません。
CollectionViewは深すぎる。