iOS14において、CollectionViewのscrollToItem
が機能しないバグが報告されています(執筆時、2020年11月25日現在)。AppleのDeveloper Forumsでも話題になっており、iOS14.2でも修正されていないようです。私もOS依存のバグとは気づかず、仕事で10時間くらい時間を溶かしました(ずっとiOS14のシミュレータでなんでスクロールできないんだろうと四苦八苦してた)
scrollToItemの説明(読み飛ばし可)
scrollToItem
は指定したindexPath
までcellをスクロールさせることができるものです。アプリ初回起動時のウォークスルー、チュートリアル画面などで、スワイプではなくボタンタップでcellをスクロールさせるような場合に使ったりすると思います。
例えば上記のような画面で「次へ」を押した時にページをスクロールするような場合は、以下のように書けます。
collectionView.scrollToItem(at: IndexPath(item: newPage, section: 0), at: .init(), animated: true)
しかしiOS14では、「次へ」を押してもなぜかスクロールされない状態となっています。
解決方法
フォーラムでは下記のようにscrollToItem
前後でisPagingEnable
のBool値を切り替えるような手法が提案されています。
self.collectionView.isPagingEnabled = false
self.collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
self.collectionView.isPagingEnabled = true
実際試すとこれでもうまくいくのですがこれよりも、冒頭のようなチュートリアル画面を作りたい場合は、同じくcollectionViewのsetContentOffset
で代用する方が良いのではないかなと思いました。
let cellWidth = collectionView.frame.width * CGFloat(newPage)
let cellHeight = CollectionView.frame.minY
collectionView.setContentOffset(CGPoint(x: cellWidth, y: cellHeight), animated: true)
チュートリアル画面ではなくとも今までscrollToItem
を使っていた実装は、同じように座標を取得する方法が有効かと思います。
おそらくすぐにAppleが対応してくれる問題だとは思うのですが、もしお困りの方がいらっしゃったら試してみてください〜