【移动应用开发技术】iOS如何实现无限循环轮播图效果_第1页
【移动应用开发技术】iOS如何实现无限循环轮播图效果_第2页
【移动应用开发技术】iOS如何实现无限循环轮播图效果_第3页
【移动应用开发技术】iOS如何实现无限循环轮播图效果_第4页
【移动应用开发技术】iOS如何实现无限循环轮播图效果_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】iOS如何实现无限循环轮播图效果

这篇文章主要介绍了iOS如何实现无限循环轮播图效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。本文实例为大家分享了iOS实现无限循环轮播图的具体代码,供大家参考,具体内容如下轮播图基础控件,左滑右滑都能无限循环预览思路(1)在第一张左边加一张最后一张的图片,往左滑到边缘结束后计算偏移量迅速定位成最后一张#pragma

mark

-

pagecontrol事件

//

这个是点击小圆点条进行切换,到边不能循环

-

(void)pageControlTouched

{

//

点击的时候停止计时

[self.kvTimer

setFireDate:[NSDate

distantFuture]];

//

滑到指定页面

NSInteger

curPageIdx

=

_pageControl.currentPage;

CGFloat

offsetX

=

self.frame.size.width

*

(curPageIdx

+

1);

[self.scrollView

setContentOffset:CGPointMake(offsetX,

0)

animated:YES];

//

重新开启定时器

[self.kvTimer

setFireDate:[NSDate

dateWithTimeInterval:kTimerInterval

sinceDate:[NSDate

date]]];

}

#pragma

mark

-

滚动事件

-

(void)scrollViewWillBeginDragging:(UIScrollView

*)scrollView

{

//

printf("start

drag\n");

//

记录偏移量

preOffsetX

=

scrollView.contentOffset.x;

//

开始手动滑动时暂停定时器

[self.kvTimer

setFireDate:[NSDate

distantFuture]];

}

-

(void)scrollViewDidEndDecelerating:(UIScrollView

*)scrollView

{

//

printf("end

drag\n");

//

左右边界

CGFloat

leftEdgeOffsetX

=

0;

CGFloat

rightEdgeOffsetX

=

self.frame.size.width

*

(_pageCount

+

1);

if

(scrollView.contentOffset.x

<

preOffsetX)

{

//

左滑

if

(scrollView.contentOffset.x

>

leftEdgeOffsetX)

{

self.pageControl.currentPage

=

scrollView.contentOffset.x

/

self.frame.size.width

-

1;

}

else

if

(scrollView.contentOffset.x

==

leftEdgeOffsetX)

{

self.pageControl.currentPage

=

_pageCount

-

1;

}

if

(scrollView.contentOffset.x

==

leftEdgeOffsetX)

{

self.scrollView.contentOffset

=

CGPointMake(self.frame.size.width

*

_pageCount,

0);

}

}

else

{

//

右滑

//

设置小点

if

(scrollView.contentOffset.x

<

rightEdgeOffsetX)

{

self.pageControl.currentPage

=

scrollView.contentOffset.x

/

self.frame.size.width

-

1;

}

else

if

(scrollView.contentOffset.x

==

rightEdgeOffsetX)

{

self.pageControl.currentPage

=

0;

}

//

滑动完了之后从最后多余页赶紧切换到第一页

if

(scrollView.contentOffset.x

==

rightEdgeOffsetX)

{

self.scrollView.contentOffset

=

CGPointMake(self.frame.size.width,

0);

}

}

//

结束后又开启定时器

[self.kvTimer

setFireDate:[NSDate

dateWithTimeInterval:kTimerInterval

sinceDate:[NSDate

date]]];

}

-

(void)scrollViewDidEndScrollingAnimation:(UIScrollView

*)scrollView

{

//

printf("end

scroll\n");

}

#pragma

mark

-

定时器控制的滑动

//

往右边滑

-

(void)changePageRight

{

//

设置当前需要偏移的量,每次递增一个page宽度

CGFloat

offsetX

=

_scrollView.contentOffset.x

+

CGRectGetWidth(self.frame);

//

根据情况进行偏移

CGFloat

edgeOffsetX

=

self.frame.size.width

*

(_pageCount

+

1);

//

最后一个多余页面右边缘偏移量

//

从多余页往右边滑,赶紧先设置为第一页的位置

if

(offsetX

>

edgeOffsetX)

{

//

偏移量,不带动画,欺骗视觉

self.scrollView.contentOffset

=

CGPointMake(self.frame.size.width,

0);

//

这里提前改变下一个要滑动到的位置为第二页

offsetX

=

self.frame.size.width

*

2;

}

//

带动画滑动到下一页面

[self.scrollView

setContentOffset:CGPointMake(offsetX,

0)

animated:YES];

if

(offsetX

<

edgeOffsetX)

{

self.pageControl.currentPage

=

offsetX

/

self.frame.size.width

-

1;

}

else

if

(offsetX

==

edgeOffsetX)

{

//

最后的多余那一页滑过去之后设置小点为第一个

self.pageControl.currentPage

=

0;

}

}

//

往左边滑

-

(void)changePageLeft

{

//

设置当前需要偏移的量,每次递减一个page宽度

CGFloat

offsetX

=

_scrollView.contentOffset.x

-

CGRectGetWidth(self.frame);

//

根据情况进行偏移

CGFloat

edgeOffsetX

=

0;

//

最后一个多余页面左边缘偏移量

//

从多余页往左边滑动,先设置为最后一页

if

(offsetX

<

edgeOffsetX)

{

self.scrollView.contentOffset

=

CGPointMake(self.frame.size.width

*

_pageCount,

0);

offsetX

=

self.frame.size.width

*

(_pageCount

-

1);

}

//

带动画滑动到前一页面

[self.scrollView

setContentOffset:CGPointMake(offsetX,

0)

animated:YES];

if

(offsetX

>

edgeOffsetX)

{

self.pageControl.currentPage

=

offsetX

/

self.frame.size.width

-

1;

}

else

if

(offsetX

==

edgeOffsetX)

{

//

最后的多余那一页滑过去之后设置小点为最后一个

self.pageControl.currentPage

=

_pageCount

-

1;

}

}(2)总共只有左、中、右三个页面,每次滑动后重新进行数据跟页面的关联#pragma

mark

-

定时器回调

-

(void)changePageRight

{

//

往右滑并且设置小圆点,永远都是滑到第三页

[_scrollView

setContentOffset:CGPointMake(self.frame.size.width

*

2,

0)

animated:YES];

[self

resetPageIndex:YES];

}

-

(void)changePageLeft

{

//

往左滑,永远都是滑动到第一页

[_scrollView

setContentOffset:CGPointMake(0,

0)

animated:YES];

[self

resetPageIndex:NO];

}

#pragma

mark

-

重新设置索引和页面图片

-

(void)resetPageIndex:(BOOL)isRight

{

if

(isRight)

{

//

根据之前的page下标来修改

if

(_prePageIndex

==

_pageCount

-

1)

{

//

到头了就回到第一个

_pageControl.currentPage

=

0;

}

else

{

//

这里用_prePageIndex来算,否则点击小圆点条会重复计算了

_pageControl.currentPage

=

_prePageIndex

+

1;

}

}

else

{

if

(_prePageIndex

==

0)

{

_pageControl.currentPage

=

_pageCount

-

1;

}

else

{

_pageControl.currentPage

=

_prePageIndex

-

1;

}

}

_prePageIndex

=

_pageControl.currentPage;

}

-

(void)resetPageView

{

//

每次滑动完了之后又重新设置当前显示的page时中间的page

UIImageView

*leftPage

=

[_scrollView

viewWithTag:1000];

UIImageView

*middlePage

=

[_scrollView

viewWithTag:1001];

UIImageView

*rightPage

=

[_scrollView

viewWithTag:1002];

if

(_pageControl.currentPage

==

_pageCount

-

1)

{

//

n-

1

->

n

->

0

leftPage.image

=

_kvImageArray[_pageControl.currentPage

-

1];

middlePage.image

=

_kvImageArray[_pageControl.currentPage];

rightPage.image

=

_kvImageArray.firstObject;

}

else

if

(_pageControl.currentPage

==

0)

{

//

n

->

0

->

1

//

到尾部了,改成从头开始

leftPage.image

=

_kvImageArray.lastObject;

middlePage.image

=

_kvImageArray.firstObject;

rightPage.image

=

_kvImageArray[1];

}

else

{

//

x

-

1

->

x

->

x

+

1

leftPage.image

=

_kvImageArray[_pageControl.currentPage

-

1];

middlePage.image

=

_kvImageArray[_pageControl.currentPage];

rightPage.image

=

_kvImageArray[_pageControl.currentPage

+

1];

}

//

重新设置偏移量

_scrollView.contentOffset

=

CGPointMake(self.frame.size.width,

0);

}

#pragma

mark

-

pagecontrol事件

-

(void)pageControlTouched

{

[self

stopTimer];

NSInteger

curPageIndex

=

_pageControl.currentPage;

if

(curPageIndex

>

_prePageIndex)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论