实现scrollView的自动循环滚动,需要实现几个方法。

其中scrollView中始终保存三张图片,其他的图片在滚动到时再进行加载。

循环的实现主要是在setUpdate 中,如果索引为0是第一个,索引为2是最后一个,这是对索引值进行改变。第一个后接着显示最后一个,最后一个后接着显示第一个。依次循环。

分析过程为:

1、首先是set方法 setImageNames

 #pragma mark - setter方法重写
- (void)setImageNames:(NSArray *)imageNames
{
_imageNames = imageNames; // 删除之前的所有图片,如果没有这句话图片会重复添加
[self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; //NSLog(@"setImageNames----%@",imageNames);
// 添加图片
for (int i = ; i < kCount; i ++ )
{
UIImageView *imageView = [[UIImageView alloc] init];
[self.scrollView addSubview:imageView];
} // 设置pageControl的页数
self.pageControl.numberOfPages = _imageNames.count; // 更新内容
[self setUpdate];
}

2、然后实现更新内容的方法 setUpdate

 // 更新内容
- (void)setUpdate
{
NSLog(@"setUpdate---%ld",self.scrollView.subviews.count);
//NSInteger index = 0;
// 更新数据,图片内容
for (int i = ; i < self.scrollView.subviews.count; i ++)
{
UIImageView *ima = self.scrollView.subviews[i]; // 获取图片
NSInteger index = self.pageControl.currentPage; // 当前索引 if (i == ) { // 最左边图片,第一个,共三个
index --;
}
else if(i == ) // 最右边图片,第二个,共三个
{
index ++;
} if (index < ) { // 如果是最左边,显示最后一张图片,总得图片个数,_imageNames.Count;
index = self.pageControl.numberOfPages - ; //
}
else if(index >= self.pageControl.numberOfPages) // 如果是最右边,就显示第一张图片
{
index = ;
} ima.tag = index; // 设置tag为计算索引值
ima.image = [UIImage imageNamed:self.imageNames[index]]; // 重新设置图片 }
// NSLog(@"setUpdate--index--%ld",index);
// 设置scrollView偏移量
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width, );
}

3、然后设置控件frame

 #pragma mark - 计算控件的frame
// layout ,计算控件的frame
- (void)layoutSubviews
{
[super layoutSubviews]; // 设置scrollView的frame
self.scrollView.frame = self.bounds;
//view的高度和宽度
CGFloat viewW = self.scrollView.frame.size.width;
CGFloat viewH = self.scrollView.frame.size.height; // view 的位置
self.scrollView.contentSize = CGSizeMake(viewW * kCount, ); // 计算图片的 frame
for(int i = ; i < kCount ; i ++)
{
UIImageView *imageView = self.scrollView.subviews[i];
imageView.frame = CGRectMake(i * viewW, , viewW, viewH);
} // pageControl 的frame
self.pageControl.frame = CGRectMake(viewW - , viewH - , , );
}

4、实现代理方法 scrollViewDidScroll

 #pragma mark - 代理方法
// 代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// NSLog(@"scrollViewDidScroll----%ld",self.scrollView.subviews.count); // 计算最中间的那个imageView位置
NSLog(@"scrollViewDidScroll----%ld",self.scrollView.subviews.count);
NSInteger page = ;
CGFloat minDistance = MAXFLOAT; for (int i = ; i < self.scrollView.subviews.count; i++)
{
UIImageView *ima = self.scrollView.subviews[i]; // 获取图片
CGFloat distance = ;
// 计算当前image视图中图片相对与整个scrollView的绝对距离
distance = ABS(ima.frame.origin.x - self.scrollView.contentOffset.x);
//
if (distance < minDistance)
{
minDistance = distance; // 最小值
page = ima.tag;
}
}
NSLog(@"scrollViewDidScroll--pageIndex-%ld",page);
self.pageControl.currentPage = page; // 显示最新的页码
}

5、设置滚动下一页的方法

 - (void)nextPage
{
// 设置新的偏移量,直接对宽度乘以2,不用担心越界
[self.scrollView setContentOffset:CGPointMake( * self.scrollView.frame.size.width, ) animated:YES];
}

主要代码如下:

 //
// SLQPageScroll.m
// UIScrollView-分页练习
//
// Created by Christian on 15/5/31.
// Copyright (c) 2015年 slq. All rights reserved.
//
// 滚动图片个数
#define kCount 3 #import "SLQPageScroll.h" @interface SLQPageScroll () <UIScrollViewDelegate> // 遵守协议 @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; // scrollView
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl; // pageControl
@property (strong, nonatomic ) NSTimer *timer; @end @implementation SLQPageScroll + (instancetype)pageScroll
{
// NSStringFromClass 将类名转换成字符串,xib文件名和类名一样
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
} #pragma mark - 计算控件的frame
// layout ,计算控件的frame
- (void)layoutSubviews
{
[super layoutSubviews]; // 设置scrollView的frame
self.scrollView.frame = self.bounds;
//view的高度和宽度
CGFloat viewW = self.scrollView.frame.size.width;
CGFloat viewH = self.scrollView.frame.size.height; // view 的位置
self.scrollView.contentSize = CGSizeMake(viewW * kCount, ); // 计算图片的 frame
for(int i = ; i < kCount ; i ++)
{
UIImageView *imageView = self.scrollView.subviews[i];
imageView.frame = CGRectMake(i * viewW, , viewW, viewH);
} // pageControl 的frame
self.pageControl.frame = CGRectMake(viewW - , viewH - , , );
} #pragma mark - setter方法重写
- (void)setImageNames:(NSArray *)imageNames
{
_imageNames = imageNames; // 删除之前的所有图片,如果没有这句话图片会重复添加
[self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; //NSLog(@"setImageNames----%@",imageNames);
// 添加图片
for (int i = ; i < kCount; i ++ )
{
UIImageView *imageView = [[UIImageView alloc] init];
[self.scrollView addSubview:imageView];
} // 设置pageControl的页数
self.pageControl.numberOfPages = _imageNames.count; // 更新内容
[self setUpdate];
} #pragma mark - 代理方法
// 代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// NSLog(@"scrollViewDidScroll----%ld",self.scrollView.subviews.count); // 计算最中间的那个imageView位置
NSLog(@"scrollViewDidScroll----%ld",self.scrollView.subviews.count);
NSInteger page = ;
CGFloat minDistance = MAXFLOAT; for (int i = ; i < self.scrollView.subviews.count; i++)
{
UIImageView *ima = self.scrollView.subviews[i]; // 获取图片
CGFloat distance = ;
// 计算当前image视图中图片相对与整个scrollView的绝对距离
distance = ABS(ima.frame.origin.x - self.scrollView.contentOffset.x);
//
if (distance < minDistance)
{
minDistance = distance; // 最小值
page = ima.tag;
}
}
// NSLog(@"scrollViewDidScroll--pageIndex-%ld",page);
self.pageControl.currentPage = page; // 显示最新的页码
} // 更新内容
- (void)setUpdate
{
//NSLog(@"setUpdate---%ld",self.scrollView.subviews.count);
// 更新数据,图片内容
for (int i = ; i < self.scrollView.subviews.count; i ++)
{
UIImageView *ima = self.scrollView.subviews[i]; // 获取图片
NSInteger index = self.pageControl.currentPage; // 当前索引 if (i == ) { // 最左边图片,第一个,共三个
index --;
}
else if(i == ) // 最右边图片,第二个,共三个
{
index ++;
} if (index < ) { // 如果是最左边,显示最后一张图片,总得图片个数,_imageNames.Count;
index = self.pageControl.numberOfPages - ; //
}
else if(index >= self.pageControl.numberOfPages) // 如果是最右边,就显示第一张图片
{
index = ;
} ima.tag = index; // 设置tag为计算索引值
ima.image = [UIImage imageNamed:self.imageNames[index]]; // 重新设置图片 }
// NSLog(@"setUpdate--index--%ld",index)
// 设置scrollView偏移量
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width, );
} // 停止拖动
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
[self setUpdate];
} // 拖动暂停状态
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self setUpdate];
} - (void)setCurrentColor:(UIColor *)currentColor
{
_currentColor = currentColor;
self.pageControl.currentPageIndicatorTintColor = _currentColor;
}
- (void)setOtherColor:(UIColor *)otherColor
{
_otherColor = otherColor;
self.pageControl.pageIndicatorTintColor = _otherColor;
} // xib 初始化完毕会调用这个方法
- (void)awakeFromNib
{
self.pageControl.currentPage = ;
self.scrollView.bounces = NO; // 开启定时器
[self startTimer]; } - (void)nextPage
{
// 设置新的偏移量
[self.scrollView setContentOffset:CGPointMake( * self.scrollView.frame.size.width, ) animated:YES];
} #pragma mark - 定时器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self startTimer];
} - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self stopTimer];
} - (void)startTimer
{
// 创建定时器
self.timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
// 设置计时器线程的优先级和其他线程一样
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
} - (void)stopTimer
{
[self.timer invalidate]; // 停止计时器
self.timer = nil; //清空指针
}
@end

IOS开发学习笔记036-UIScrollView-循环自动滚动的更多相关文章

  1. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  2. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

  3. IOS开发学习笔记035-UIScrollView-自动滚动

    让图片自动滚动的话,需要使使用定时器,循环计算当前页的页码.并且在拖动图片时停止计时器,停止拖动时启动计时器. 定时器 方法1: performSelector [self performSelect ...

  4. iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装

    一个简单的利用UIScrollView 实现的无线滚动banner,下面的代码实现,因为封装问题,对两个及一下的view 支持出了一点问题(view是传参进来的,不可以生成两份),但是原理是正确的,智 ...

  5. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  6. IOS开发学习笔记021-练习2

    只是简单练习一下,主要是学习里面的思想,处理问题的方法. 不过还有一个问题没想到解决方法. 那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊.(知道怎么办了,原来是方法addTarget) ...

  7. IOS开发学习笔记013-内存管理

    内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 6.内存管理总结 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):s ...

  8. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

  9. IOS开发学习笔记041-UITableView总结1

    一.UITableView的常用属性 1.分割线 // 分割线 self.tableView.separatorColor = [UIColorredColor]; // 隐藏分割线 self.tab ...

随机推荐

  1. isset或array_key_exists,检查数组键是否存在

    今天在导出报表的时候遇到了一个问题,undefined index:pid,然后就纳闷了,我的数组里面根本就没有pid,为什么会出现这个错误呢,我遍历了一下数组,发现果然有pid这个键,奇怪呀,我有做 ...

  2. MVC 控制器向View传值的三种方法(转)

    1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResult Index() { DateTime date = DateTime.Now; return ...

  3. LeetCode OJ 3Sum 3个整数之和

    题意:给一个vector<int>容器,要求每当找到3个元素之和为0时就将这3个数按大小顺序记下来,用一个二维vector返回.也就是vector< vector<int> ...

  4. AngularJS 应用

    AngularJS模块(Module)定义了AngularJS的应用. AngularJS控制器(Controller)用于控制AngularJS应用. ng-app指令定义了应用,ng-contro ...

  5. head与body(新手向)

    网页文档包含了页头(head)与主体(body) 页头 -是对该网页文档进行描绘的主体信息. -至少含有title与meta. meta描述网页的特征,比如字符编码,平时广泛用的utf-8.且meta ...

  6. 01_15_Struts2_带参数的结果集

    01_15_Struts2_带参数的结果集 1. 背景说明 服务器端页面跳转的时候,通过struts提供的标签的valuestack可以直接取.服务器端的转发,valuestack的对象属性可以共享. ...

  7. Express框架 --router/app.use

    翻看去年自己记录的印象笔记,准备把笔记上的一些内容也同时更新到博客上,方便自己查看. 1.app.use和app.get的区别及解析 app.use(path,callback)中的callback既 ...

  8. C/C++程序基础 (五)位运算

    C++中四种转换运算符的区分 const_cast 修改const和volatile属性 reinterpret_cast 指针间类型转换或者指针和整形的转换.二进制重新翻译. static_cast ...

  9. nginx负载均衡核心组件介绍

    一.nginx upstream 模块介绍 1.upstream模块介绍 nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括 proxy_pass ...

  10. IE支持直接查看Json数据注册表代码

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json] ...