UIScrollView的。 关于实施“无限”滚动/缩放有什么想法?(UIScrollView.

2019-07-20 02:37发布

所以,UITableView的支持基本上是“无限”的滚动。 有”可能是一个极限,但吸盘可以滚动的looonnnggg时间。 我想模仿与一个UIScrollView这种行为,但有两个基本障碍:

1)scrollView.contentSize固定在创建时间。 2)变焦可以打击任何延迟加载方案都到地狱,因为它可能会导致infinte数据爆炸。

有其他人在那里思考这个想法? 呀,我知道,我们实际上在谈论重新创建谷歌地图在这里。 任何见解将不胜感激。

欢呼声,道格

Answer 1:

虽然这是不可能有一个真正无限的UIScrollView,有一个你可以用它来模拟这种行为的一些简单的技巧。

  1. 处理固定contentSize :有一些固定大小的视图通过滚动视图处理,并在发射或实例,设置内容偏移,这样你所看到的处理视图的中间。 然后,只需看的内容偏移量(使用志愿或其他方法),如果你靠近任何优势,更新一套新的内容视图的内容(适当偏移)和重置滚动视图的contentOffset属性是回到中间。
  2. 处理缩放:做类似的事情,只是这一次观看滚动视图缩放系数。 一旦进入某一个点,做一些操作,以任何数据你呈现,使其出现放大,那么缩放因子重置为1.0。 例如,如果您滚动的图像和它被放大到出现两次大,编程应用某种变换,使图像的两倍,那么滚动视图缩放因子重置为1.0。 图像仍然会出现放大,但滚动视图将能够继续进一步放大是必要的。 (谷歌地图借此一步在那里懒加载的用户更详细视图缩放 - 你可能会或可能不会选择实现这个)


Answer 2:

我刚刚完成实施对我infitine滚动。 我在执行我的UITableViewCell与滚动型和Navigationbuttons。 滚动视图包含了所有与同宽x看法。 视图水平alined和寻呼已启用。

scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;

我codelogic是这样的:

  1. 在我的初始化函数我
    • 创建(为滚动型)各方面的意见和
    • 把它们放到一个数组和
    • 将它们添加到滚动视图
  2. 然后我打电话,在一个循环的每个视图的位置(每次检测滚动此功能将需要太调用)计算功能。 它始终把所述阵列的所述第一元件,并且将框架(0,0,...,...),第二与(i *宽度,0,...,...)等上。 beeing调用的函数如下:

     - (void)updateOffsetsOfViews{ int xpos = 0; for (int i=0; i<[views count]; i++) { UIImageView *_view = [views objectAtIndex:i]; CGRect aFrame = _view.frame; aFrame.origin.x = xpos; aFrame.origin.y = 0.0; _view.frame = aFrame; xpos += viewWidth; } float center = 0; if(fmod([views count],2) == 1){ center = viewWidth * ([views count]-1)/2; }else { center = viewWidth * [views count]/2; } [scrollView setContentOffset:CGPointMake(center, 0)]; lastOffset = center; } 
  3. 然后(仍处于初始化过程中)我想补充一个观察者

     [scrollView addObserver:self forKeyPath:@"contentOffset" options:0 context:nil]; 

    所以每次东西在滚动视图的变化,我得到叫(observeValueForKeyPath)函数,它看起来像这样:

     - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { UIImageView *_viewFirst = (UIImageView *)[views objectAtIndex:0]; if ( fmod([scrollView contentOffset].x,viewWidth) == 0.0) { if ([scrollView contentOffset].x > lastOffset) { [views removeObjectAtIndex:0]; [views addObject:_viewFirst]; [self updateOffsetsOfViews]; }else if ([scrollView contentOffset].x < lastOffset) { UIImageView *_viewLast = (UIImageView *)[views lastObject]; [views removeLastObject]; [views insertObject:_viewLast atIndex:0]; [self updateOffsetsOfViews]; } } } 
  4. 而在的dealloc或viewDidUnload(取决于你如何实现它)不要忘记删除观察者。

     [scrollView removeObserver:self forKeyPath:@"contentOffset"]; 

希望这可以帮助,你可能会注意到一些开销,但在我执行我也支持像滚动5页(嗯......无限)在一次和autoanimated滚动等,所以你可能会看到一些可能被扔掉。



Answer 3:

该StreetScroller从苹果示例项目演示了如何在一个UIScrollView进行无限滚动。



Answer 4:

请记住,当滚动动画, contentOffset逐页改变了很多次,而不仅仅是网页,但在动画的每个步骤。



Answer 5:

或许设置contentSize一些巨大价值,然后移动围绕底层视图追踪如平铺样品就可以了在视图中的位置的数量有限。

为了减轻的最终到达的边缘,并且具有突然recenter视图(目前取消任何滚动运动),该视图可重新定时,它是静止的,不时的可能性。

无论如何,这就是我要试试。



文章来源: UIScrollView. Any thoughts on implementing “infinite” scroll/zoom?