LoginSignup
0
0

More than 1 year has passed since last update.

[iOS]UICollectionViewCompositionalLayoutを使うと横スクロールのUIScrollViewDelegateが取れない問題

Last updated at Posted at 2021-08-20

間違ってたらすいません
UICollectionViewCompositionalLayoutってそもそも「縦スクロール内に横スクロール」は可能だけど、「横スクロール内に縦スクロール」みたいな構成はできないんですね。
できないんですよね?
たぶんできない。

それで、UICollectionViewCompositionalLayoutを適用したUICollectionViewのdelegateを設定してUIScrollViewDelegateを取ろうとすると、縦は取れるけど横が取れない。
まあ何となく取れない気がしますよね。

問題なのは横スクロールのUICollectionViewを作りたかった場合で、UICollectionViewCompositionalLayoutを使いたい場合。

そもそもそんなシーンどれだけある?と思いますが結構あります。
1つはpagingをしたい場合です。
UICollectionViewのpagingはマジで複雑だし微調整で数日掛かります。できればUICollectionViewCompositionalLayoutでpagingしてしまいたい。
しかしそうすると「いま何ページ目か」とか「スクロールが終わったら」を取れない。

それでどうすれば良いのか調べていたら

let layoutSection = NSCollectionLayoutSection(group: layoutGroup)
layoutSection.visibleItemsInvalidationHandler = { (visibleItems, point, env) in
    print("-------------------------")
    visibleItems.forEach { item in
        print("item: ", item.indexPath.item, point)
    }
}

こうやるらしいです。
visibleItems, point, env、なんか知らないclassやらprotocolがたくさん出てきて嫌な感じですが、とりあえず上記のようにするとスクロールする毎に「現在表示されているcellのindexPath」とかそのポジションが取れるので、割といいんじゃないかと思いました。

またなんかあったら追記します。

もっとちゃんと分かりやすい記事

https://qiita.com/hcrane/items/92c0e08f9bf7d017f53f

追記:
いや、スクロールの終了が取れないですね。
cellのイベントは取れますが、スクロールのイベントがさっぱり取れません。

というわけでゴリ押しで内部のscrollViewのdelegateを奪ったところ、レイアウトが壊れました。
どうやらscrollViewのdelegateは既に使用されているようでした。

詰みました。

似たような質問
https://stackoverflow.com/questions/58791121/uiscrollview-delegate-methods-not-called-when-uicollectionviewcompositionallayou

追記:
諦めました。非公開クラス使いたくないし。

0
0
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
0
0