加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 如何在iOS 6的UICollectionView中实现无限水平和

发布时间:2020-12-16 07:03:34 所属栏目:百科 来源:网络整理
导读:我正在尝试在iOS 6中的UICollectionView中实现无限的水平和垂直滚动.我已经设法让它工作,但它很慢且不连贯. 在StackOverflow上提出了类似的问题,但最深入的问题是遵循Apple的WDC视频并使用集合而不是滚动来实现.我的设计基于这个和其他类似问题的评论,但我仍
我正在尝试在iOS 6中的UICollectionView中实现无限的水平和垂直滚动.我已经设法让它工作,但它很慢且不连贯.

在StackOverflow上提出了类似的问题,但最深入的问题是遵循Apple的WDC视频并使用集合而不是滚动来实现.我的设计基于这个和其他类似问题的评论,但我仍然无法让它看起来流畅.

我基本上试图模仿HBO GO iPad应用程序的行为,它提供了一个节目网格,允许你向任何方向滚动它们,当你到达最后它只是包围节目,所以你觉得你是无限滚动.

我所做的是创建一个自定义布局,在网格中排列UICollectionView单元格.然后我将UICollectionView子类化了覆盖了它的layoutSubviews方法并创建了一个reecenterIfNecessary函数,就像Eliza的WDC视频节目一样.这是有效的,我得到无限的“滚动”,但内容不会改变.

所以我创建了一个指向视图控制器的委托,每当它包装时,我都会告诉委托移动它的数据源,它确实如此,但它没有反映在UICollectionView中,所以对[self reloadData]的最后一次调用会刷新视图和一切“有效”.我得到无限滚动.

但是因为我调用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];
}
}

解决方法

我已经组建了一个库,可以在所有方向上提供无限滚动的视图.当用户滚动时,框架会布置图块并让代表知道,以便设置图块的演示文稿.至于性能,框架没有引入延迟:完全60 fps.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读