2014-01-07 54 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控制中获得想法 - 如何实现这个问题。