因此,UITableView基本上支持“无限”滚动。可能有一个限制,但吸盘可以滚动looonnnggg时间。我想用UIScrollView模仿这种行为,但有两个基本障碍:
1)scrollView.contentSize在创建时被修复。 2)缩放可以将任何延迟加载方案都吹到地狱,因为它可能导致infinte数据爆炸。
让其他人思考这个想法吗?是的,我知道,我们本质上是在谈论在这里重新创建谷歌地图。任何见解都会非常感激。
干杯, 道格
答案 0 :(得分:13)
我刚刚完成了为我实现的英文卷轴。 在我的实现中,我有UITableViewCell,带有scrollView和Navigationbuttons。 scrollView包含具有相同宽度的x视图。视图是水平的,并且启用了分页。
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;
我的codelogic如下所示:
然后我调用一个函数,在循环中计算每个视图的位置(每次检测到滚动时,此函数也需要调用)。它始终采用数组的第一个元素并将帧设置为(0,0,...,...),第二个元素设置为(i * width,0,....,....)等等上。所谓的函数看起来像这样:
- (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;
}
然后(仍在初始化过程中)我添加了一个观察者
[scrollView addObserver:self forKeyPath:@"contentOffset" options:0 context:nil];
所以每当scrollView中的某些内容发生变化时,我都会调用(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];
}
}
}
在dealloc或viewDidUnload中(取决于你如何实现它)不要忘记删除观察者。
[scrollView removeObserver:self forKeyPath:@"contentOffset"];
希望这会有所帮助,您可能会注意到一些开销,但在我的实现中,我也支持同时滚动5页(嗯......无限制)和自动滚动等等,这样您可能会看到可能被丢弃的东西。 / p>
答案 1 :(得分:10)
虽然不可能有一个真正无限的UIScrollView,但你可以用一些简单的技巧来模仿这种行为。
contentSize
:滚动视图处理一些固定大小的视图,在启动或实例化时,设置内容偏移量,以便您看到处理视图的中间位置。然后只需观察内容偏移(使用KVO或其他方法),如果您接近任何边缘,请使用一组新内容(适当偏移)更新视图内容,并将滚动视图的contentOffset
属性重置为回到中间。答案 2 :(得分:4)
Apple的StreetScroller示例项目演示了如何在UIScrollView中执行无限滚动。
答案 3 :(得分:2)
请记住,当动画滚动时,contentOffset
会多次更改,而不是逐页更改,而是动画中的每一步。
答案 4 :(得分:0)
或许将contentSize
设置为某个巨大的值,然后移动有限数量的底层视图来跟踪视图位置,就像在Tiling示例中一样。
为了减轻最终到达边缘并且不得不突然重新定位视图(取消当前运动中的任何滚动)的可能性,视图可以在静止时不时重新定位。
无论如何,这就是我要尝试的。