无限滚动或其他一些技术?

时间:2014-01-07 17:47:39

标签: ios objective-c uiscrollview uicollectionview

我正在为UICollectionView的水平布局工作以表示时间轴。理想情况下,我希望它无限滚动,但我不确定正确的方法是什么。

现在我已经开始使用UICollectionViewLayout的子类和一个只有3个单元格的简单案例。我重写了scrollView委托方法scrollViewDidEndDecelerating并跳回到中心卡并偏移我的模型以匹配。

除非用户快速滚动,否则它们会到达另一张卡片的末尾。他们被“抓住”并且必须释放集合视图。当视图停止减速时,定心发生并且它们能够继续。

我有一个演示on GitHub

我想知道是否有另一种方法,或者我缺少的东西。我熟悉Apple关于无限滚动视图的WWDC演示文稿,并且看过带有滚动文本的演示项目,但我不确定如何使用分页或集合视图。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

如果您想知道用户何时移动到新页面,则应使用scrollViewDidScroll。正如您所发现的,如果用户快速滚动,则不会调用scrollViewDidEndDecelerating,因为滚动视图永远不会停止移动。

我已将您的代码改编为:

  1. 触发scrollViewDidScroll而不是scrollViewDidEndDecelerating
  2. 使用集合视图边界的中心点来测试索引路径(当第一个或第三个单元格跨越屏幕的一半时,这会导致单元格更新。)
  3. 直接设置内容偏移,而不是滚动到索引路径,从滚动视图的当前位置跳转整页。
  4. 以下是代码:

    - (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];
        }
    }
    

答案 1 :(得分:-1)

通过在水平UICollectionView的两侧添加额外的单元格,可以使其看起来像无限滚动滚动视图。如果contentOffset位于左侧附近,则会在滚动内容视图的右侧显示完全相同的单元格。我想你可以从HFSwipeView中获取想法 - 在gitHub中控制 - 如何实现这个问题。