循环滚动视图

方法1:前后+1方法,这也最常见的一种做法。假如我们有四张需要展示的图片,

我们创建了一个数组来保存图片名字,此时数组中保存的是按顺序的1.png,2.png,3.png,4.png

,这四个图片名字。要实现无限循环的效果,我们需要改动一下这个数组为:4.png,1.png,2.png

,3.png,4.png,1.png,我们发现在原来数组的前后分别加入了一个图片名字,即将要循环展示的

下一张图片的名字。当你滑动到4.png的时候,下一张会是1.png。当你在1.png往回滑动的时候,

将要出现4.png。


好了,下面是我们的核心内容:我们发现目前数组中有6个图片,当我们从3.png滑动到4.png,

又从4.png滑动到1.png的时候,我们要神不知鬼不觉的迅速切换到排在第二位的1.png。反向滑动

的时候也是如此,从1.png滑动到4.png的时候,我们要神不知鬼不觉的切换到拍到倒数第二位的

4.png。那么怎么样才能实现神不知鬼不觉呢?


看下面这两个UIScrollView的实例方法:

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

这两个方法可以在animated参数为NO的时候,帮助我们迅速切换视图。


当每一次滑动结束的时候,UIScrollViewDelegate会有一个回调方法:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

 

此时我们来检测是否是滑动到了我们将要出发的1.png和4.png,如果是的话,那么就悄悄调用上面

两个方法中的任意一个来实现视图切换。

实现代码如下所示:

int currentPage = (int)self.scrollView.contentOffset.x/320;

if (currentPage==0)

{

    [self.scrollView scrollRectToVisible:CGRectMake(320 * [slideImages count]-2,0,320,460) 

animated:NO]; // 序号0,跳转到最后1页

}

else if (currentPage==[slideImages count]-1)

{

 // 最后+1,循环第1页

    [self.scrollView scrollRectToVisible:CGRectMake(320,0,320,460) animated:NO];

}


方法2:瞒天过海。此方法中无论数据源有多少个,UIScrollView只保留其中三个视图,其实这是方法1

的变种。当你滑动UIScrollView的时候,无非是向前滑动,或者是向后滑动,所以能够组成无限循环

的基本条件就是前、中、后 三个视图。当你每次滑动的时候我都神不知鬼不觉的切换一下这三个视图

。这也是和方法1 的最主要区别。


看看下面的区别:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)aScrollView {

    [_scrollView setContentOffset:CGPointMake(_scrollView.frame.size.width, 0) 

animated:YES];

}


我们发现每一次滑动完成之后,UIScrollView总是重新切换回默认的中这一个视图。下面这个代理方

法将要实现重置这三个视图:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {


    int x = aScrollView.contentOffset.x;

    //往下翻一张

    if(x >= (2*self.frame.size.width)) {

        [self loadData];

    }

    //往上翻

    if(x <= 0) {

        [self loadData];

    }

}


loadData() 的实现原理非常简单,现将UIScrollView的所有视图移除,在重新根据数据源绘图来加载

到UIScrollView中。

- (void)loadData

{    

    //从scrollView上移除所有的subview

    NSArray *subViews = [_scrollView subviews];

    if([subViews count] != 0) {

        [subViews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    }

        

    for (int i = 0; i < 3; i++) {  //只有3个视图

        UIView *v = [_curViews objectAtIndex:i];

        v.frame = CGRectOffset(v.frame, v.frame.size.width * i, 0);

        [_scrollView addSubview:v];

    }

    

    [_scrollView setContentOffset:CGPointMake(_scrollView.frame.size.width, 0)];

}


至于你怎么绘图就是你的事情了,我这里只是简单的分析一下。


自动无限循环


刚才讲解了无限循环的两种不同实现方法,下面来讲解一下如何让它自动滑动。我想大家都用过

NSTimer,没错,用它来实现简单的计时器最好不过了。


在适当位置初始化一个NSTimer,设定3秒执行一次runTimePage()方法:

   // 定时器 循环

    [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(runTimePage)

 userInfo:nil repeats:YES];

 

在runTimePage()方法中,我们将要实现获取当前page页数,然后跳转到下一个page。

- (void)runTimePage

{

    int page = pageControl.currentPage; // 获取当前的page

    page++;

    pageControl.currentPage = page > [slideImages count]-2 ? 0 : page ;

    [self.scrollView setContentOffset:CGPointMake(320*(page+1),0) animated:YES];

}



转载于:https://my.oschina.net/u/2359409/blog/528215

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值