iOS_UIScrollView实现无限滚动,思路与代码

UIScrollView实现无限滚动的三种思路。

当然只是我的一些用法,当然还有非常多的实现方式,如果大家有好的实现思路也可以告诉我,相互学习嘛~

UIScrollView无限滚动

第一种方式:

原理:利用结束的位置来重新设置ScrollView ContentOffset的值,让人产生视觉上的无限循环,优点:代码易懂,缺点,会创建多余的内存。

第二种方式:

原理:利用中间的两个变量来当前的View及缓冲的View,只创建两个View,将当前的View放在中间。判断滑动的位置,优先去缓冲的View找,然后结束滑动在更新当前View的image

第三种方式(这里就不讲解了):

原理:利用CollectionView来实现,代码也非常简单。一次性给数据源传入 images.count * 1000,然后默认加载的时候,跳转到 (images.count * 1000)/2.0
+ ((images.count * 1000)/2.0) % images.count的位置就实现了

github代码地址:https://github.com/MakeZL/UIScrollViewLoopDemo点击打开链接

好了。我们先看第一种实现比较简单的

<span style="font-size:14px;">/**
 *
 第一种方式:
    利用结束的位置来重新设置ScrollView ContentOffset的值,让人产生视觉上的无限循环
    优点:代码易懂
    缺点,会创建多余的内存。
 */
- (void)realizeScrollLoop1{

    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.pagingEnabled = YES;
    scrollView.frame = self.view.bounds ;
    scrollView.delegate = self;
    [self.view addSubview:scrollView];
    self.scrollView = scrollView;
    [scrollView setContentSize:CGSizeMake(([self.slideImages count] + 2) * scrollView.frame.size.width, 0)];

    CGSize scrollViewSize = scrollView.frame.size;

    // 遍历创建子控件
    [self.slideImages enumerateObjectsUsingBlock:^(NSString *imageName, NSUInteger idx, BOOL *stop) {
        UIImageView *imageView = [[UIImageView alloc] init];
        imageView.image = [UIImage imageNamed:imageName];
        imageView.frame = CGRectMake((idx+1) * scrollViewSize.width, 0, scrollViewSize.width, scrollViewSize.height);
        [scrollView addSubview:imageView];
    }];

    // 将最后一张图片弄到第一张的位置
    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.image = [UIImage imageNamed:
                       self.slideImages[[self.slideImages count] - 1]];
    imageView.frame = CGRectMake(0, 0, scrollViewSize.width, scrollViewSize.height);
    [scrollView addSubview:imageView];

    // 将第一张图片放到最后位置,造成视觉上的循环
    UIImageView *lastImageView = [[UIImageView alloc] init];
    lastImageView.image = [UIImage imageNamed:
                           self.slideImages[0]];
    lastImageView.frame = CGRectMake(scrollViewSize.width * ([self.slideImages count] + 1), 0, scrollViewSize.width, scrollViewSize.height);
    [scrollView addSubview:lastImageView];

    [scrollView setContentOffset:CGPointMake(scrollViewSize.width, 0)];
}</span>

然后再UIScrollView的delegate里面实现即可

<span style="font-size:14px;">- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSInteger page = scrollView.contentOffset.x / scrollView.frame.size.width;
    // 如果当前页是第0页就跳转到数组中最后一个地方进行跳转
    if (page == 0) {
        [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width * ([[self slideImages] count]), 0)];
    }else if (page == [[self slideImages] count] + 1){
        // 如果是第最后一页就跳转到数组第一个元素的地点
        [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width, 0)];
    }
}</span>

是不是很简单。下面我们来看第二种

第二种方式,带缓存:

<span style="font-size:14px;">/**
 *
    第二种方式:
        利用中间的两个变量来当前的View及缓冲的View,最多创建三个View,将当前的View放在中间。判断滑动的位置,优先去缓冲的View找
        优点:对内存消耗少,缺点:代码相比要复杂一丝丝
 */
- (void) realizeScrollLoop2{

    status = ScrollViewLoopStatusResuing;

    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.pagingEnabled = YES;
    scrollView.frame = self.view.bounds ;
    scrollView.delegate = self;
    [self.view addSubview:scrollView];
    self.scrollView = scrollView;

    CGSize scrollViewSize = scrollView.frame.size;
    scrollView.contentSize = CGSizeMake(3 * scrollViewSize.width, 0);
    scrollView.contentOffset = CGPointMake(scrollViewSize.width, 0);

    UIImageView *currentView = [[UIImageView alloc] init];
    currentView.tag = 0;
    currentView.frame = CGRectMake(scrollViewSize.width, 0, scrollViewSize.width, scrollViewSize.height);
    currentView.image = [UIImage imageNamed:@"00.jpg"];
    [scrollView addSubview:currentView];
    self.currentView = currentView;

    [self resuingView];
    self.index = 0;

}</span>

实现UIScrollViewDelegate

<span style="font-size:14px;">- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (status == ScrollViewLoopStatusResuing) {
        if (scrollView.contentOffset.x > _currentView.frame.origin.x) {

            NSInteger val = self.index + 1;
            if (self.index >= [self.slideImages count] - 1) {
                val = 0;
            }

            // 取缓冲区的View
            self.resuingView.image = [UIImage imageNamed:[NSString stringWithFormat:@"0%zd.jpg",val]];
            self.resuingView.x = CGRectGetMinX(_currentView.frame) + _currentView.width;
            self.isLastScrollDirection = YES;
        }else{
            NSInteger val = self.index - 1;
            if (val < 0) {
                val = [self.slideImages count]-1;
            }
            self.resuingView.image = [UIImage imageNamed:[NSString stringWithFormat:@"0%zd.jpg",val]];
            self.resuingView.x = 0;
            self.isLastScrollDirection = NO;
        }
    }
}</span>

要再结束的时候把当前currentView的image赋值最新的。

<span style="font-size:14px;">- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    // 是否是往右边滑动
    if (self.isLastScrollDirection) {
        self.index++;
    }else{
        self.index--;
    }

    // 补全
    if (self.index < 0) {
        self.index = [self.slideImages count]-1;
    } else if(self.index > [self.slideImages count]-1){
        self.index = 0;
    }

    _currentView.image = [UIImage imageNamed:[NSString stringWithFormat:@"0%zd.jpg",self.index]];

}</span>

这样就能实现无限循环了

时间: 2024-08-24 10:25:10

iOS_UIScrollView实现无限滚动,思路与代码的相关文章

基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效

本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: <style type="text/css"> #liu{ width:280px; height: 279px; background: url(shishi.png) no-repeat; border-radius:140px; -webkit-animation:run 6s

Cocos2d-x 《雷电大战》-双层地图无限滚动

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!下面,我们开始吧 先来看看效果: Cocos2d-x版本:3.4 工程环境:VS30213 一.实现思路 其实就是两张图片,然后同时一起向下(向上)滚动,当一张图片完全出视野后,就

Cocos2d-x《雷电大战》-双层地图无限滚动

本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!下面,我们开始吧 先来看看效果: Cocos2d-x版本:3.4 工程环境:VS30213 一.实现思路 其实就是两张图片,然后同时一起向下(向上)滚动,当一张图片完全出视野后,就把它调到最上面.形成两个图片交替出现,不过,一般为游戏中我们都感觉像是一张图片,那是因为两张图片的头尾连接

iOScollectionView广告无限滚动(Swift实现)

今天公司里的实习生跑过来问我一般App上广告的无限滚动是怎么实现的,刚好很久没写博客了,就决定写下了,尽量帮助那些处于刚学iOS的程序猿. 做一个小demo,大概实现效果如下图所示: 基本实现思路: 1. 在你需要放置无限滚动展示数据的地方把他的数据,在原本的基础上把你要展示的数据扩大三倍.(当然扩大两倍也是可以的,三倍的话,比较好演示) // MARK: - 设置数据源 func collectionView(_ collectionView: UICollectionView, number

jquery实现无限滚动瀑布流实现原理

现在类似于pinterest这类的表现效果很火,其实我比较中意的是他的布局效果,而不是那种瀑布流. 虽然我不是特别喜欢这种瀑布流的表现样式,但是还是写了几篇关于无限滚动瀑布流效果的文章,Infinite scroll+Masonry=无限滚动瀑布流,infinite-scroll-jquery滚动条(下拉)加载数据插件之类的文章.可能是我表达描述不是很详细清楚,所以好多朋友看了不是很清楚,并发信给我求解释.所以有了今天这篇文章. 其实早在:十几款jquery无限滚动插件这 篇文章中我就提到过这种

无限滚动的ImageView

无限滚动的ImageView 1)链接 github上地址为:  https://github.com/Q42/AndroidScrollingImageView 附效果图: 2)实现源码 源码比较少,在此贴上自定义属性和代码: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ScrollingView">

利用递归 实现UIScrollView无限滚动的效果

项目需求 利用递归 实现UIScrollView无限滚动的效果. 上机试题, #import "ViewController.h" @interface ViewController (){ UIScrollView *mainScroll; BOOL isFinish; int x; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; x=0; isFinish = YES;

用原生的javascript 实现一个无限滚动的轮播图

说一下思路:和我上一篇博客中用JQ去写的轮播图有相同点和不同点 相同点: 首先页面布局是一样的 同样是改变.inner盒子的位置去显示不同的图片 不同点: 为了实现无限滚动需要多添加两张重复的图片 左右切换和前面的方法有所不同,前面是获取当前的索引值乘以-600px当做位移距离,现在是需要获取当前.inner的位置来加上或者减去-600来实现 下面来一步步的去实现轮播图: 首先是html <!DOCTYPE html> <html lang="en"> <

Android 高级UI设计笔记09:Android如何实现无限滚动列表

ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验. 对于ListView和GridView一个共同基本要求是:当用户向下滚动时可以动态加载数据支持无限滚动.下面教你如何在自己的应用中实现这个特性. 具体流程如下: (1)我们需要的一个主要组件是InfiniteScrollListener类,它实现了OnScrollListener接口.让我们直接