LoginSignup
10
6

More than 3 years have passed since last update.

【iOS14】CollectionViewのscrollToItemが機能しない場合の対処法

Posted at

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が対応してくれる問題だとは思うのですが、もしお困りの方がいらっしゃったら試してみてください〜

参考

UICollectionViewでチュートリアル画面を作る

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6