我正在为UICollectionView的水平布局工作以表示时间轴。理想情况下,我希望它无限滚动,但我不确定正确的方法是什么。
现在我已经开始使用UICollectionViewLayout的子类和一个只有3个单元格的简单案例。我重写了scrollView委托方法scrollViewDidEndDecelerating
并跳回到中心卡并偏移我的模型以匹配。
除非用户快速滚动,否则它们会到达另一张卡片的末尾。他们被“抓住”并且必须释放集合视图。当视图停止减速时,定心发生并且它们能够继续。
我有一个演示on GitHub。
我想知道是否有另一种方法,或者我缺少的东西。我熟悉Apple关于无限滚动视图的WWDC演示文稿,并且看过带有滚动文本的演示项目,但我不确定如何使用分页或集合视图。
有人可以帮忙吗?
答案 0 :(得分:0)
如果您想知道用户何时移动到新页面,则应使用scrollViewDidScroll
。正如您所发现的,如果用户快速滚动,则不会调用scrollViewDidEndDecelerating
,因为滚动视图永远不会停止移动。
我已将您的代码改编为:
scrollViewDidScroll
而不是scrollViewDidEndDecelerating
。以下是代码:
- (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中控制 - 如何实现这个问题。