Objective-C:没有启用分页的无尽 UIScrollView

问题描述 投票:0回答:3

在我的iPhone应用程序中,有一个滚动视图

pagingEnabled=NO
,它最多可以包含200个子视图(150 x 150),挑战是进行延迟加载并模拟水平方向上的无限滚动(无弹跳)。

此请求有解决方案或替代方案吗?

objective-c pagination uiscrollview lazy-loading
3个回答
6
投票

滚动视图的延迟加载在 Apple 的示例代码项目之一中进行了演示:PageControl

为了假装无休止的滚动,我的建议是让你的滚动视图一开始就非常宽,比普通人在一组滚动行为中滚动的宽度要宽。然后在您的委托方法

-scrollViewDidEndScrollingAnimation:
-scrollViewDidEndDragging:willDecelerate:
-scrollViewDidEndDecelerating:
(用户完成滚动后将调用其中的一个或多个)中,重新定位您的内容以存在于滚动视图的中心并更新您的
contentOffset
没有动画的点。

为了在视觉上工作,您还需要禁用水平滚动条。您还需要考虑如何使用此方法确定在特定

contentOffset
处绘制哪个视图,因为您将无法再将
contentOffset.x
除以滚动视图的边界来找出您所在的位置。


2
投票

你好,我找到了方法。 我有一个包含所有子视图的主数组(在我的例子中它们是图像,所以我存储名称)。 滚动视图只有 3 个子视图:左视图、当前视图、右视图。 分页已启用,因此用户在任何时候都无法向左/向右旋转多个视图。 我所做的是: 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)];

希望这会有所帮助,尽管“有计划的人”是克拉克先生,他指明了道路。

贡索


1
投票

Matt Gallagher 有一篇博客文章,描述了这个问题的解决方案。我用过,效果很好。

Cocoa Touch 中的 UIScrollView 和 UIPageControl 允许具有多个平移页面的用户界面。 Apple 提供的示例项目 (PageControl) 将每个页面的所有子视图保存在延迟加载的数组中。我将向您展示如何仅使用两个子视图来实现此目的,无论您希望表示多少个虚拟页面。

它的工作原理是在子视图周围打乱并在必要时重置其内容。我用它来显示闪存卡,其中可能有 3 到 3,000 个项目。尽管它现在已设置为分页,但我相信您可以让它与常规滚动一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.