【发布时间】:2013-02-27 21:26:27
【问题描述】:
我正在尝试在 iOS 6 中从 UICollectionView 中实现无限水平和垂直滚动。我已经设法让它工作,但它很慢而且不稳定。
在 StackOverflow 上也有类似的问题,但其中最深入的问题是遵循 Apple 的 WDC 视频并使用集合而不是滚动来实现。我的设计基于这个和其他类似问题中的 cmet,但仍然无法让它看起来很流畅。
我基本上是在尝试模仿 HBO GO iPad 应用程序的行为,该应用程序呈现一个节目网格,并允许您向任何方向滚动它们,当您到达终点时,它只是将节目包裹起来,让您感觉像无限滚动。
我所做的是创建一个自定义布局,将UICollectionView 单元格排列在一个网格中。然后我将UICollectionView 子类化,覆盖了它的layoutSubviews 方法,并创建了一个reecenterIfNecessary 函数,就像Eliza 的WDC 视频节目一样。这行得通,我可以无限“滚动”,但内容不会改变。
所以我创建了一个指向视图控制器的委托,每当它包装时,我告诉委托移动它的数据源,它确实如此,但它没有反映在 UICollectionView 中,所以最后一次调用 @ 987654329@ 刷新视图,一切“正常”。我得到无限滚动。
但是因为我打电话给reloadData,所以延迟很明显,滚动条会闪烁(从“内容”被“重新加载”)。这是不可接受的,我不知道如何解决它!
感谢任何帮助。我包含了recenterIfNecessary 函数以防万一。
- (void) recenterIfNecessary{
CGPoint currentOffset = [self contentOffset];
CGFloat contentHeight = [self contentSize].height;
CGFloat contentWidth = [self contentSize].width;
//calc center point which would leave same amount of content on both sides
CGFloat centerY = (contentHeight - [self bounds].size.height) / 2.0;
CGFloat centerX = (contentWidth - [self bounds].size.width) / 2.0;
if (currentOffset.x == 0 && currentOffset.y == 0){
//assume this is first load. Set offset to content center.
self.contentOffset = CGPointMake(centerX, centerY);
return;
}
//distance from center is abs of where we are and where we want to be:
CGFloat offsetY = centerY-currentOffset.y;
CGFloat offsetX = centerX-currentOffset.x;
//now we decide if we want to recenter
int deltaX = 0;
int deltaY = 0;
if (fabs(offsetX) > CELL_WIDTH){
if (offsetX < 0){
deltaX = -ceil(offsetX / CELL_WIDTH);
}else{
deltaX = -floor(offsetX / CELL_WIDTH);
}
offsetX += offsetX + (CELL_WIDTH * deltaX);
self.contentOffset = CGPointMake(centerX, currentOffset.y);
}
if (fabs(offsetY) > CELL_HEIGHT){
if (offsetY < 0){
deltaY = -ceil(offsetY / CELL_HEIGHT);
}else{
deltaY = -floor(offsetY / CELL_HEIGHT);
}
offsetY += offsetY + (CELL_HEIGHT * deltaY);
self.contentOffset = CGPointMake(currentOffset.x, centerY);
}
if (fabs(offsetX) > CELL_WIDTH || fabs(offsetY) > CELL_HEIGHT){
//move subviews to reflect scrolling
for (UIView *subview in self.subviews) {
CGPoint center = subview.center;
center.x += offsetX;
center.y += offsetY;
subview.center = center;
}
if ([self.infiniteDataModelDelegate conformsToProtocol:@protocol(InfiniteDataModelProtocol)]){
//moves the data model to reflect "scrolling"
[self.infiniteDataModelDelegate contentDidChangeModelDeltaX:deltaX deltaY:deltaY];
}
[self reloadData];
}
}
【问题讨论】:
-
您找到解决方案了吗?我想知道同样的事情。
-
不,至少没有超出我发布时所拥有的内容,它可以工作,但速度很慢并且有点“故障”。我最终只使用了一个常规的 scrollView 并使它看起来像一个“集合”视图(一个网格)。它工作得很好,它不是我的目标是 collectionView!
-
我也有同样的问题,但关注的是
UIScrollView。我得到了您正在寻找的答案.. 使用来自用户 rdelmar 的UICollectionView。链接:stackoverflow.com/a/15553973/406677 -
rdelmar 的答案是我正在寻找的(如果这个问题与我的重复,但由于某种原因得到了答案!)我能够让滚动视图无限滚动,所以 @PaulPeelen 如果您想要 UIScrollView 的答案,我很乐意分享。但我无法(直到 rdelmar)让它为 UICollectionView 正常工作
标签: objective-c ios6 uiscrollview uicollectionview infinite-scroll