2014-01-07 126 views
1

我正在處理UICollectionView的水平佈局以表示時間軸。理想情況下,我希望它可以無限滾動,但我不確定正確的方法是什麼。無限滾動或其他技術?

現在我已經開始了一個UICollectionViewLayout的子類和一個簡單的3個單元格的情況。我重寫scrollView委託方法scrollViewDidEndDecelerating並跳回到中心卡並抵消我的模型以匹配。

這有效,除非用戶快速滾動,並且他們到達另一張卡的末尾。他們被「抓住」並且必須釋放收集視圖。當視圖停止減速時,居中發生並且能夠繼續。我的演示on GitHub

我想知道是否有另一種方法,或者我失蹤了。我對蘋果的無限滾動視圖的WWDC演示很熟悉,並且看到了帶有滾動文本的演示項目,但是我不確定如何使它適用於分頁或集合視圖。

任何人都可以幫忙嗎?

回答

0

如果您想知道用戶何時移至新頁面,則應使用scrollViewDidScroll。正如您發現的,如果用戶快速滾動,則不會調用scrollViewDidEndDecelerating,因爲滾動視圖從不停止移動。

我已經適應您的代碼:對scrollViewDidScroll,而不是scrollViewDidEndDecelerating

  1. 觸發。
  2. 使用集合視圖邊界的中心點來測試索引路徑(這會導致單元格在第一個或第三個單元格跨過屏幕一半時更新)。
  3. 直接設置內容偏移量,而不是滾動到索引路徑,從滾動視圖的當前位置跳轉整頁。

下面的代碼:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    [self centerIfNecessary]; 
} 

- (void)centerIfNecessary 
{ 
    // Fetch the index path in the middle of the collection view 
    NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:CGPointMake(self.collectionView.contentOffset.x + 
                          self.collectionView.bounds.size.width/2, 
                          self.collectionView.contentOffset.y)]; 

    NSInteger row = visibleIndexPath.row; 

    // Three cases: Row is 0, so we've moved left. 
    //     Row is 1, we haven't moved. 
    //     Row is 2, we've moved right. 

    if (row == 0) 
    { 
     self.date = [[self calendar] dateBySubtractingDays:1 fromDate:self.date]; 
     self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x + 
                 self.collectionView.bounds.size.width, 
                 self.collectionView.contentOffset.y); 
     [self.collectionView reloadData]; 
    } 
    else if (row == 2) 
    { 
     self.date = [[self calendar] dateByAddingDays:1 toDate:self.date]; 
     self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x - 
                 self.collectionView.bounds.size.width, 
                 self.collectionView.contentOffset.y); 
     [self.collectionView reloadData]; 
    } 
} 
+0

這段代碼有多彈性?它似乎可以開箱即用,但如果我改變了單元格的大小,以便在屏幕上顯示多個單元格,該怎麼辦? – Moshe

+0

上面的代碼有兩個假設:頁面大小等於集合視圖邊界的大小,並且滾動是水平的。爲了推廣它,你需要使用'contentOffset'來水平和/或垂直地建立頁面偏移量。在使用'scrollViewDidScroll'來檢查和調整'contentOffset'方面同樣的原則也適用。 – knellr

-1

你可以使它看起來像一個無限滾動滾動視圖通過對你的水平UICollectionView的兩側增加了額外的細胞。如果contentOffset靠近左側,它將在滾動內容視圖的右側顯示完全相同的單元格。我想你可以從HFSwipeView - gitHub控制中獲得想法 - 如何實現這個問題。