objective-c – 如何在iOS 6的UICollectionView中实现无限水平和
我正在尝试在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |