在我的iPhone应用程序中有一个滚动视图pagingEnabled=NO
,最多可包含200个子视图(150 x 150),挑战是在水平方向上进行延迟加载和模拟无限滚动(无弹跳)。
此请求是否有解决方案或替代方案?
答案 0 :(得分:6)
在Apple的一个示例代码项目中演示了延迟加载滚动视图:PageControl。
假冒无休止的滚动,我建议将滚动视图设置为非常宽,比一般人在一组滚动行为中滚动更宽。然后在您的委托方法-scrollViewDidEndScrollingAnimation:
,-scrollViewDidEndDragging:willDecelerate:
和-scrollViewDidEndDecelerating:
中,在用户完成滚动后将调用其中的一个或多个,将内容重新定位到滚动视图的中心并在没有动画的情况下更新contentOffset
点。
为了在视觉上工作,您还需要禁用水平滚动条。您还需要考虑如何使用此方法确定在特定contentOffset
处绘制的视图,因为您将无法再将contentOffset.x
除以滚动视图的边界以查找你在哪里。
答案 1 :(得分:2)
你好我找到了办法。 我有一个包含所有子视图的主数组(在我的例子中,它们是图像,所以我存储了名称)。 scrollview只有3个子视图:left,current,right。 启用了分页,因此用户无法在任何时间向左/右旋转多个视图。 我所做的是: 1)跟踪他在主阵列上的当前位置。如果他向左移动,减去一个;正确添加一个。像这样:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[some code to determine current page, based on contentOffset]
if (page == 0){
NSLog(@"Going left");
if (currentPage > 0){
currentPage--;
} else {
//cycle to last
currentPage = [images count] -1;
}
} else if (page == 2){
NSLog(@"Going right");
if (currentPage < ([images count] -1)){
currentPage++;
} else {
//cycle to first
currentPage = 0;
}
} else{
NSLog(@"Not moving");
}
2)用户移动后,我重新加载了3张新图像,如下所示:
//updates the 3 views of the scrollview with a new center page.
-(void) updateScrollViewForIndex:(NSInteger)newCenterPage{
//fist clean scroll view
for (UIView *sView in [scroll subviews]){
[sView removeFromSuperview];
}
NSInteger imgCount = [images count];
//set center view
[self loadImageIndex:newCenterPage atPosition:1];
//set left view
if (newCenterPage > 0){
[self loadImageIndex:newCenterPage-1 atPosition:0];
} else {
//its the first image, so the left one is the last one
[self loadImageIndex:imgCount-1 atPosition:0];
}
//set right view
if (newCenterPage < imgCount-1){
[self loadImageIndex:newCenterPage+1 atPosition:2];
} else {
//its the last image, so ther right one is the first one
[self loadImageIndex:0 atPosition:2];
}
}
3)最后再次将滚动视图重新居中到中心视图:
[scroll setContentOffset:CGPointMake(1 * viewWidth, 0)];
希望这会有所帮助,尽管“有计划的人”是克拉克先生,他指出了方向。
Gonso
答案 2 :(得分:1)
Matt Gallagher有一个blog post,它描述了这个确切问题的解决方案。我已经习惯了它,效果很好。
Cocoa Touch中的UIScrollView和UIPageControl允许用户界面具有多个平移页面。 Apple提供的示例项目(PageControl)为延迟加载的数组中的每个页面保留所有子视图。我将向您展示如何使用两个子视图来实现这一点,无论您希望表示多少个虚拟页面。
它的工作原理是在子视图周围移动并在必要时重置其内容。我用它来显示闪存卡,其中可能有3到3,000个项目。虽然它现在已经设置为分页,但我相信你可以让它与常规滚动一起工作。