我刚刚完成了为我实施的infitine卷轴。 在我的实现中,我有一个scrollView和Navigationbuttons的UITableViewCell。 scrollView包含全部具有相同宽度的x视图。视图水平排列并启用分页。
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;
我codelogic是这样的:
- 在我的初始化函数我
- 创建所有视图(滚动视图)和
- 把它们放到一个数组和
- 将它们添加到scrollView
然后我调用一个函数,在循环中计算每个视图的位置(每次检测到滚动时,都需要调用该函数)。它始终占用数组的第一个元素,并将帧设置为(0,0,...,...),第二个元素设置为(i * width,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;
}
然后(仍处于初始化过程中)我想补充一个观察者
[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];
}
}
}
而在的dealloc或viewDidUnload(取决于你如何实现它),不要忘了圣雷莫观察员。
[scrollView removeObserver:self forKeyPath:@"contentOffset"];
希望这会有所帮助,您可能会注意到一些开销,但在我执行我也支持像滚动5页(嗯......无限)在一次和autoanimated滚动等,所以你可能会看到一些那可能会被扔掉。
你看过MapKit吗? – 2009-09-29 18:10:43
以及UITableView是UIScrollView的一个子类 – 2010-06-01 19:03:10