实现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. ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)

    在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...

  2. pc-要实现相隔一定时间数据排序变化一次

    有时候产品会有这种要求,就是展示的数据三天是正序的,一天是逆序的,解决是: 以某一个时间点为基准点,然后获取当前的时间,然后计算差值,分情况 //专利 JPView : function(Sorder ...

  3. Python核心编程——正则表达式

    本篇博客都是我认真读之后写的,有些地方和书上的语句一样…… 1.简介 正则表达式为高级的文本模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称regex)是一些由字符 ...

  4. lnmp一键安装 nginx

    官网: https://lnmp.org/install.html 1.下载完整版:http://soft.vpser.net/lnmp/lnmp1.5-full.tar.gz文件大小:715MB M ...

  5. sql常识

    1.UNION与UNION ALL的区别UNION去重且排序UNION ALL不去重不排序2.sql语句or与union all的执行效率比较:union all>union> in &g ...

  6. go语言,安装包fetch error 问题解决方案

    最近需要安装grequests,出现了下面的error [fdf@zxmrlc ~]$ go get github.com/levigross/grequests package golang.org ...

  7. Android(java)学习笔记92:Android线程形态之 AsyncTask (异步任务)

    1. AsyncTask和Handler的优缺点比较: 1)AsyncTask实现的原理和适用的优缺点        AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTa ...

  8. Web前端学习流程

  9. Python实现注册和登录

    一.注册账号需要实现的功能 1.输入:用户名,密码,密码确认 2.限制1:输入的账号和密码不能为空 3.限制2:两次输入密码必须一致 4.限制3:用户名不能重复 5.限制4:错误次数为4次 6.用字典 ...

  10. 使用 Repeater方式和完全静态页面使用AJAX读取和提交数据

    1.使用Repeater方式: Comments.aspx <html xmlns="http://www.w3.org/1999/xhtml"> <head r ...