2017-08-02 4 views
0

UIViewControllerの中にUICollectionViewが設定されています。このビューでは、ボタンで切り替えられたプロパティに基づいて2つの異なるタイプのデータ/セルが表示されます。データソースは常に同じで、各ボタンタップで再投入されます。UICollectionView contentOffsetが間違っています

ボタンアクションがトリガされるたびに、メインデータソース配列を空にして再充填し、コレクションビューで-reloadDataを呼び出します。これは正常に動作し、予期しない動作はありません。

スクロール位置は、contentOffsetのa.k.a.というフィルタの変更後も同じです。つまり、コレクションビューではAのセルが表示されていて、すばやくスクロールを開始し、ボタンをタップして、セルがBに変わってもスクロールを続けるように見えます。ユーザーは、覚えていれば、最後の位置まで繰り返しスクロールしなければなりません。

私はこれを解決するために、scrollPositionsNSMutableDictionaryをビューコントローラのプロパティとして使用しようとしました。キーはフィルタタイプ(AまたはB)を表し、値は現在のコンテンツオフセットのy座標を表します(これは垂直方向にスクロールされたコレクションビューです)。

これはある程度はうまくいくように見えますが、contentOffsetプロパティは一定のピクセル数だけランダムに表示されているように見えますが、時にはそれはちょうど12ダース程度です画面の価値。ここで

は、私がこれまで試したものです:

  • boundsをキャプチャする代わりに
  • 現在可視インデックスパスを思い出しNO
  • automaticallyAdjustsScrollViewInsetsを設定edgesForExtendedLayout
  • を調整するが、これは正しくないように思わ時には同様に
  • コレクションビューで-invalidateLayoutを呼び出し、オフセットをキャプチャして復元する前に、親ビュー上のを参照してください。
  • UIPageViewControllerにストレートに切り替わり、UIViewControllerにはそれぞれのフィルタごとにUICollectionViewが含まれていますが、

残念ながら、私が何を試しても、私はいつも同じ結果に終わります。以前に設定されたフィルタに戻ると、以前に取り込まれたオフセットに変更されます。私はちょうど正直に私の知恵の最後にここに誰かが何か提案を持っていますか? ALSO

、これがすべて自動レイアウトで設定されており、過去にバニラUIScrollView sおよび自動レイアウトを持ついくつかの悪い経験を持っていた重要な場合。だから、おそらく問題の一部が継承されている可能性がありますか?

答えて

0

NSMutableDictionaryのソリューションは機能するはずです。フィルタを変更するときにスクロールを止めることを忘れないでください。オフセットで可能な限り正確にすることができます。現在のスクロールを停止するには、次の

collectionView.isScrollEnabled = false 

はその後戻ってそれを有効にします。

collectionView.isScrollEnabled = true 
+0

ありがとうございました。スクロールを無効にしようとしたことを明記しておきます。また、コレクションビューが内部的にそのロジックを解決し、オフセットプロパティを更新できるように、数秒待ってからフィルタを変更してください。私が提案したシナリオは、スクロールがこの問題の要点ではないが、ユーザーがタブを切り替える場所を提案した。むしろ、 'contentOffset'プロパティの不正確さです。 –

関連する問題