【问题标题】:How to implement infinite horizontal and vertical scrolling in the UICollectionView in iOS 6?如何在 iOS 6 的 UICollectionView 中实现无限水平和垂直滚动?
【发布时间】: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


【解决方案1】:

我整理了一个库,可提供全方位的无限滚动视图。当用户滚动时,框架会布置图块并让代理知道,以便它可以设置图块的演示文稿。至于性能,该框架没有引入任何延迟:全 60 fps。

带有在无限滚动墙上显示 Flickr 图像的示例应用程序的框架在这​​里:https://github.com/vovagalchenko/scroll-for-days。此外,这里是示例应用的运行视频:https://cloud.box.com/s/d6bgvlot175au5a3jeh5

【讨论】:

    【解决方案2】:

    您尝试过这种方法吗?

    -(void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{
        if ([self.products count] > 8 && indexPath.row == [self.products count] - 8) {
            [self loadMoreItems];
            [self.collectionView reloadData];
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多