2017-08-02 40 views
0

我有一個UICollectionView設置在一個正常的UIViewController內,該視圖應該顯示兩種不同類型的數據/單元格,基於按鈕切換的屬性。數據源始終保持不變,只需在每個按鈕上重新填充即可。UICollectionView contentOffset wrong

每當按鈕動作被觸發時,它將清空並重新填充主數據源數組,並在集合視圖上調用-reloadData。這工作正常,沒有意外的行爲。

現在的問題是,滾動位置,也就是contentOffset,在更改過濾器後保持不變。所以說集合視圖將顯示A類型的單元格,我將開始快速滾動,點擊按鈕,並查看單元格更改爲鍵入B,但仍保持滾動。如果用戶能夠記住它,用戶將不得不重複回到最後的位置。

我試圖通過在我的視圖控制器中有一個scrollPositionsNSMutableDictionary作爲屬性來解決這個問題。這些鍵表示過濾器類型(AB),並且這些值表示當前內容偏移量的y座標(這是一個垂直滾動的集合視圖)。

我遇到的問題是,儘管這似乎在某種程度上起作用,但contentOffset屬性似乎隨機關閉了一定數量的像素,有時候它只是十幾個像素,有時候是半個像素屏幕的價值。

這裏是我試過到目前爲止:

  • 捕捉bounds代替
  • 調整edgesForExtendedLayout
  • 設置automaticallyAdjustsScrollViewInsetsNO
  • 記住當前可見指數路徑,但這似乎是不正確的有時還有
  • 在集合視圖上調用-invalidateLayout-layoutIfNeeded在捕獲偏移量之前和恢復之前的父視圖中
  • 直接切換到UIPageViewController並且UIViewController包含針對每個不同過濾器的UICollectionView,但這會引發其他大量問題。

但不幸的是,無論我嘗試什麼,我總是會得到相同的結果。當返回到先前設置的過濾器時,它會變回到先前捕獲的偏移量,這幾乎是我離開的位置,但並不完全。我很坦白地說,我的智慧到此爲止,任何人都有更多的建議嗎?

還有,如果有問題,這個都是用AutoLayout設置的,並且在過去有過與vanilla UIScrollView s和AutoLayout的一些不好的體驗。那麼也許有些問題可能會被遺傳?

回答

0

你的解決方案與NSMutableDictionary應該工作,只要記住當改變過濾器時停止滾動,所以你可以在偏移量上有最大的準確度。要停止當前的滾動:

collectionView.isScrollEnabled = false 

然後啓用它。

collectionView.isScrollEnabled = true 
+0

謝謝你的回答。我應該指定我已經嘗試禁用滾動。在更改過濾器之前還要等待幾秒鐘,希望集合視圖可以在內部解析其邏輯並更新其偏移屬性。我提出的場景是,用戶在滾動時切換標籤的位置不是問題的癥結所在。而是,'contentOffset'屬性的不準確性。 –