IOS开发学习笔记036-UIScrollView-循环自动滚动
实现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-循环自动滚动的更多相关文章
- iOS开发学习笔记:基础篇
iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...
- ios开发学习笔记(1)
objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...
- IOS开发学习笔记035-UIScrollView-自动滚动
让图片自动滚动的话,需要使使用定时器,循环计算当前页的页码.并且在拖动图片时停止计时器,停止拖动时启动计时器. 定时器 方法1: performSelector [self performSelect ...
- iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装
一个简单的利用UIScrollView 实现的无线滚动banner,下面的代码实现,因为封装问题,对两个及一下的view 支持出了一点问题(view是传参进来的,不可以生成两份),但是原理是正确的,智 ...
- ios开发学习笔记(这里一定有你想要的东西,全部免费)
1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...
- IOS开发学习笔记021-练习2
只是简单练习一下,主要是学习里面的思想,处理问题的方法. 不过还有一个问题没想到解决方法. 那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊.(知道怎么办了,原来是方法addTarget) ...
- IOS开发学习笔记013-内存管理
内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 6.内存管理总结 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):s ...
- iOS开发学习笔记
1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...
- IOS开发学习笔记041-UITableView总结1
一.UITableView的常用属性 1.分割线 // 分割线 self.tableView.separatorColor = [UIColorredColor]; // 隐藏分割线 self.tab ...
随机推荐
- Java有关List的stream基本操作
参考博客: https://www.jianshu.com/p/9fe8632d0bc2 Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有I ...
- cms-最近更新
在这一讲中有几个很重要的地方需要注意: 1.在查询帖子的时候需要把帖子类型id带到帖子类型表中把类型查询出来 2.在字帖子查询语句中用limt限制查询那个阶段的帖子 3.在界面显示的时候需要用到字符串 ...
- 平时对ES6的一些总结
1.Genertor中yield和Interator中的next方法 Genertor的yield是把这个函数变成分段的:Interator中的next也是一个一个执行的: function* f() ...
- HDU5200 数据离线处理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5200 ,数据离线处理. 这是BestCoder Round #36的C题,比赛时自己用线段树做,姿势不 ...
- 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复
如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...
- 【BZOJ1064】[NOI2008] 假面舞会(图上DFS)
点此看题面 大致题意:有\(k\)种面具(\(k\)是一个未知数且\(k≥3\),每种面具可能有多个),已知戴第\(i\)种面具的人能看到第\(i+1\)种面具上的编号,特殊的,戴第\(k\)种面具的 ...
- 2018.6.2 AndroidStudio项目中的问题:===== oast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间
oast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间 在Android源码中的NotificationManagerService.java这个类中定义了两个静态变量 ...
- Optional int parameter 'fundID' is present but cannot be translated into a null value due to being declared as a primitive type
错误的意思是: "可选的int参数'fundID'存在但由于被声明为基本类型而无法转换为空值" 意思是fundID被申明为int的基本数据类型, 不能转换为字符串的null值. 难 ...
- zabbix监控系统时间的问题
分类: 监控 2013-03-19 21:40:11 发现zabbix监控系统时间的一个问题!zabbix监控系统时间用的key是system.localtime,返回当前的系统时间,而配置tig ...
- windows下简单使用pip
1. 在python官网上下载python时会自带pip,并且在安装Python时若未取消会默认一并安装 2. 找出pip.exe所在位置, 3. 右击此电脑,点击属性 4. 高级系统设置 5. 点击 ...