2014.12.10 ScrollerView循环滚动的三种方法

1.循环滚动

每次滚动后都将scrollview的offset设置为中间的一页

若本次滚动是向前一页滚动,则把三页都向后放置,最后一页放到开头

若本次滚动是向后一页滚动,则把三页都向前放置,第一页放到末尾

初始化UISCrollView

float x,y,width,height;

x = WIDTH_OFF_SET;

y = HEIGHT_OFF_SET;

width = WIDTH_OFF_SET;

height = SCROLLVIEW_HEIGHT;

for (int j=0; j<3; j++) {

UIView  *view = [[UIView alloc] initWithFrame:CGRectMake(x*(j), y, width, height)];

[view setTag:10+j];//view的tag为10,11,12

[view setBackgroundColor:[UIColor yellowColor]];

for (int i=0; i<count; i++) {

UIButton*pointNButton = [UIButton buttonWithType:UIButtonTypeCustom];

[pointNButton setTitle:[NSString stringWithFormat:@"%d",100+i] forState:UIControlStateNormal];

[pointNButton setBackgroundColor:[UIColor blueColor]];

[pointNButton setTag:100+i];

[pointNButton setFrame:CGRectMake(6.5+(13+65)*i, 8, 65, 65)];

[pointNButton addTarget:self action:@selector(pointBtnClicked:) forControlEvents:UIControlEventTouchUpInside];

[view addSubview:pointNButton];

}

[scrollView addSubview:view];

[view release];

}

[scrollView setDelegate:self];

[scrollView setPagingEnabled:NO];

[scrollView setContentSize:CGSizeMake(WIDTH_OFF_SET*3, 80.0)];

[scrollView setShowsHorizontalScrollIndicator:NO];

#define WIDTH_OFF_SET630.0

#define HEIGHT_OFF_SET0

#define SCROLLVIEW_WIDTH390.0

#define SCROLLVIEW_HEIGHT80.0

#define SET_FRAME(ARTICLEX) x = ARTICLEX.frame.origin.x + increase;\

if(x < 0) x = pageWidth * 2;\

if(x > pageWidth * 2) x = 0.0f;\

[ARTICLEX setFrame:CGRectMake(x, \

ARTICLEX.frame.origin.y,\

ARTICLEX.frame.size.width,\

ARTICLEX.frame.size.height)]

#pragma mark -

#pragma mark UIScrollViewDelegate

//将三个view都向右移动,并更新三个指针的指向,article1永远指向当前显示的view,article0是左边的,article2是右边的

- (void)allArticlesMoveRight:(CGFloat)pageWidth {

UIView *view0 = [scrollView viewWithTag:10];

UIView *view1 = [scrollView viewWithTag:11];

UIView *view2 = [scrollView viewWithTag:12];

UIView *tmpView = view2;

view2 = view1;

view1 = view0;

view0 = tmpView;

float increase = pageWidth;

CGFloat x = 0.0f;

SET_FRAME(view2);

SET_FRAME(view0);

SET_FRAME(view1);

}

- (void)allArticlesMoveLeft:(CGFloat)pageWidth {

UIView *view0 = [scrollView viewWithTag:10];

UIView *view1 = [scrollView viewWithTag:11];

UIView *view2 = [scrollView viewWithTag:12];

UIView *tmpView = view0;

view0 = view1;

view1 = view2;

view2 = tmpView;

float increase = -pageWidth;

CGFloat x = 0.0f;

SET_FRAME(view1);

SET_FRAME(view2);

SET_FRAME(view0);

}

- (void)scrollViewDidScroll:(UIScrollView *)theScrollView

{

CGFloat pageWidth = WIDTH_OFF_SET;

// 0 1 2

int page = floor((theScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

if(page == 1) {

//用户拖动了,但是滚动事件没有生效

return;

} else if (page == 0) {

[self allArticlesMoveRight:pageWidth];

} else {

[self allArticlesMoveLeft:pageWidth];

}

CGPoint p = CGPointZero;

p.x = pageWidth;

[theScrollView setContentOffset:p animated:NO];

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)theScrollView

{

CGFloat pageWidth = WIDTH_OFF_SET;

// 0 1 2

int page = floor((theScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

if(page == 1) {

//用户拖动了,但是滚动事件没有生效

return;

} else if (page == 0) {

[self allArticlesMoveRight:pageWidth];

} else {

[self allArticlesMoveLeft:pageWidth];

}

CGPoint p = CGPointZero;

p.x = pageWidth;

[theScrollView setContentOffset:p animated:NO];

}

2.种方法思想是一样的,运用scrollRectToVisible

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView

{

float currentPage =scrollView.contentOffset.x;

NSLog(@"=======bao===scrollViewDidEndDragging==currentPage=%d",currentPage);

if (currentPage >WIDTH_OFF_SET&&currentPage<WIDTH_OFF_SET*2) {

[scrollView scrollRectToVisible:CGRectMake(0,0,SCROLLVIEW_WIDTH,SCROLLVIEW_HEIGHT) animated:NO];

} else if (currentPage<0) {

[scrollView scrollRectToVisible:CGRectMake(WIDTH_OFF_SET,0,SCROLLVIEW_WIDTH,SCROLLVIEW_HEIGHT) animated:NO];

}

}

3。改变conentOffset

#pragma mark UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)_scrollView

{

int currentPage =(int)scrollView.contentOffset.x;

if (currentPage >WIDTH_OFF_SET) {

scrollView.contentOffset = CGPointMake(abs(currentPage-WIDTH_OFF_SET), HEIGHT_OFF_SET);

} else if (currentPage<0) {

scrollView.contentOffset = CGPointMake(currentPage+WIDTH_OFF_SET,HEIGHT_OFF_SET);

}

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView

{

int x= (int)scrollView.contentOffset.x/BUTTON_OFFSET*BUTTON_OFFSET;

[scrollView setContentOffset:CGPointMake(x, HEIGHT_OFF_SET) animated:YES];

}

- (void)scrollViewDidEndDragging:(UIScrollView *)_scrollView willDecelerate:(BOOL)decelerate {

if (!decelerate) {

int x = (int)scrollView.contentOffset.y/BUTTON_OFFSET*BUTTON_OFFSET;

[scrollView setContentOffset:CGPointMake(x, HEIGHT_OFF_SET) animated:YES];

}

}

总之要想实现无缝链接就必须准备三屏你的数据,通过改变offset或是view的frame的的横纵坐标进而实现循环滚动

时间: 2024-10-17 11:24:45

2014.12.10 ScrollerView循环滚动的三种方法的相关文章

TI C66x DSP 系统events及其应用 - 5.10(创建ISR的三种情况)

ISFP是服务中断的指令包,创建ISR的三种情况: 1,一个ISFP包的8条指令就可以满足ISR 2,ISR可以占用多个连续的ISFP(前提是下面的中断没有使用) 3,ISR位于IST之外 上述图中,B IRP表示从可屏蔽中断(INT4~15)中返回(从ISR返回或者从ISFP中返回)的指令.因为B指令有5个cycle的延迟,所以在B跳转指令后加上5个NOP指令,目的是防止CPU执行到其他的程序.如在第一张图中,如果B IRP后面的指令是单cycle指令(如NOP 1),那么CPU会在执行完IN

Windows 10 应用创建模糊背景窗口的三种方法

原文 Windows 10 应用创建模糊背景窗口的三种方法 现代的操作系统中创建一张图片的高斯模糊效果非常容易,不过如果要在窗口中获得模糊支持就需要操作系统的原生支持了.iOS/Mac 和 Windows 系统都对此有支持. 本文将介绍三种创建模糊背景窗口的方法.有人可能喜欢称之为毛玻璃窗口.亚克力窗口. This post is written in multiple languages. Please select yours: 最早我是在 StackOverflow 上回答一位网友的提问时

实现滚动定位的三种方法

Web页面的定位,据我所知,有三种:一.锚点定位:二.通过js的window.scroll(x,y)或window.scrollTo(x,y):三.通过js的window.scrollBy(x,y). 锚点定位,缺点: 定位不准确,而且有兼容性问题. 所以,大多数情况下用第二种或第三种方法. 注:以下两种方法的代码均可以直接使用,不依赖于任何第三方库或框架. 下面分析下第二种方法的实现原理: 核心:window对象的两个属性:scrollTop, offsetTop. 看下这两个属性的区别: 该

二叉树遍历的三种方法(以中序为例)

二叉树遍历的三种方法 递归 简单 时间O(n) 空间O(n) 非递归+栈 中等 时间O(n) 空间O(n) 非递归.不用栈 中等 时间O(n) 空间O(1) 伪代码实现--近C++代码 方法一:递归 1 Inorder-Tree-Walk(x) 2 if(x != NULL) 3 Inorder-Tree-Walk(x->left) 4 print x->key 5 Inorder-Tree-Walk(x->right) 方法二:非递归+栈 1 Inorder-Tree-Walk(x)

排序——冒泡排序(三种方法)

冒泡排序的基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 关于程序中4中冒泡排序写法的说明: bubble_sort1:基本的冒泡排序的写法. bubble_sort2:基本冒泡排序的不同写法,基本的冒泡排序是每次遍历,每次缩小范围1,这种办法是每次正向和反向遍历,每次缩小范围2,所以两者的比较次数也是一样的. bubble_sort

PDO中执行SQL语句的三种方法

在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO构造函数连接数据库及DSN详解>中,我们介绍了如何使用构造函数连接数据库和DSN的详解,那么我们这篇文章跟大家介绍在PDO中执行SQL语句的三种方式,下面我们将一一介绍! 第一种方法:exec()方法 exec()方法返回执行SQL 语句后受影响的行数,其语法格式如下: 1 int PDO::exec(

JAVA之线程同步的三种方法

最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchronized代码段.synchronized修饰方法/类.ThreadLocal本地线程变量. 我们通过一个例子来表现这三种方法:一张银行卡里面有300块钱,15个线程从这张银行卡中取钱,每个线程取一次且每次取20块钱:当当前余额不足100元时,则向账户中汇款20元.三种方法每种方法都有5个线程.我们预期

抽象类里面的三种方法

抽象类里面有三种方法 1.抽象方法 2.普通方法 3.虚方法 1 abstract class Class1 2 { 3 //抽象类Class1里面的抽象方法 4 public abstract void str1(); 5 //抽象类Class1里面的普通方法 6 public void str2() 7 { 8 Console.WriteLine("普通方法"); 9 } 10 //抽象类Class1里面的虚方法 11 public virtual void str3() 12 {

Logstash处理json格式日志文件的三种方法

假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JSTicket:kgt8ON7yVITDhtdwci0qeZg4L-Dj1O5WF42Nog47n_0aGF4WPJDIF2UA9MeS8GzLe6MPjyp2WlzvsL0nlvkohw","CreateTime":"2015/10/13 9:39:59",&