ios基础篇(二十三)—— 定时器NSTimer与图片的自动切换
一、NSTimer
NSTimer是一个能在从现在开始到后面的某一个时刻或者周期性的执行我们指定的方法的对象。可以按照一定的时间间隔,将制定的信息发送给目标对象。并更新某个对象的行为。你可以选择在未来的某个时间将它停止、开启、甚至销毁。
1、NSTimer的创建
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
注意,这两种方法有不同;
用第一种方法需要手动addTimer:forMode: 将timer添加到一个runloop中:
如:
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:selfselector:@selector(timerAction:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
第二种scheduled方法将以默认mode直接添加到当前的runloop:
如:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
几个参数:
TimerInterval : 执行之前等待的时间
target : 需要执行方法的对象
selector : 需要执行的方法
repeats : 是否需要循环
2、释放方法
[ timer invalidate];
//如果之后定时器不再用的话,这里最好设置为nil;如果继续使用,则不需要设置
timer = nil;
3、定时器的暂停/重启
上述的关闭定时器的方法是永久性的,在暂停计时器的时候不可以用上述的停止方法。
//暂停定时器(暂时关闭)
[timer setFireDate:[NSDate distantFuture] ] ;
//开启定时器
[timer setFireDate:[NSDate distantPast] ];
二、UIScrollView、UIPageControl、NSTimer实现图片自动切换
demo:
@interface ViewController ()<UIScrollViewDelegate>{
UIPageControl *pageCtrl;
UIScrollView *scrollView;
NSArray *imageArray;
NSTimer *timer;
int lastPage;
int currentPage;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
float width = self.view.frame.size.width;
//创建UIScrollView
scrollView = [[UIScrollView alloc] initWithFrame:(CGRect){,,width,}];
scrollView.delegate = self;
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(width*, );
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
[self.view addSubview:scrollView];
//开启定时器方法
[self timeOn];
//创建UIPageControl
pageCtrl = [[UIPageControl alloc] initWithFrame:(CGRect){,,width,}];
[self.view addSubview:pageCtrl];
pageCtrl.numberOfPages = ;
pageCtrl.currentPageIndicatorTintColor = [UIColor grayColor];
pageCtrl.pageIndicatorTintColor = [UIColor colorWithWhite:0.8 alpha:];
[pageCtrl addTarget:self action:@selector(pageAction:) forControlEvents:UIControlEventTouchUpInside];
float imageWidth = width-;
float imageHeight = ;
imageArray =@[@"tu3", @"tu1", @"tu2", @"tu4", @"tu5"];
//遍历imageArray数组,添加图片到UIScrollView
for (int i=; i<imageArray.count; i++) {
NSString *image = [imageArray objectAtIndex:i];
ScrollPageView *images = [[ScrollPageView alloc] initWithFrame:(CGRect){+width*0.5*i,,imageWidth,imageHeight} setImage:[UIImage imageNamed:image]];
[scrollView addSubview:images];
}
}
//实现图片自动切换
- (void)changeImage{
currentPage = lastPage+;
[scrollView setContentOffset:(CGPoint){currentPage*,} animated:YES];
lastPage =currentPage;
if (lastPage>) {
lastPage =-;
}
}
- (void)scrollViewDidScroll:(UIScrollView *)ScrollView{
int page = scrollView.contentOffset.x/scrollView.frame.size.width;
pageCtrl.currentPage = page;
}
//将要开始拖拽关闭定时器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
[self timeOff];
}
//结束拖拽开启定时器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[self timeOn];
}
//开启定时器
- (void)timeOn{
timer = [NSTimer scheduledTimerWithTimeInterval:
target:self
selector:@selector(changeImage)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
//关闭定时器
- (void)timeOff{
[timer invalidate];
timer = nil;
}
- (void)pageAction:(UIPageControl*)page{
int pageNum =(int)pageCtrl.currentPage;
CGSize size = scrollView.frame.size;
[scrollView setContentOffset:(CGPoint){(pageNum+)*size.width,} animated:YES];
[timer invalidate];
}
ios基础篇(二十三)—— 定时器NSTimer与图片的自动切换的更多相关文章
- iOS基础篇(十三)——UITableView(一)重用机制
UITableView是app开发中常用到的控件,功能很强大,常用于数据的显示.在学习UITableView使用之前,我们先简单了解一下: 1.UITableView的重用机制 UITableView ...
- php基础篇-二维数组排序 array_multisort
原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...
- JavaScript笔记基础篇(二)
基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
- NIO相关基础篇二
转载请注明原创出处,谢谢! 上篇NIO相关基础篇一,主要介绍了一些基本的概念以及缓冲区(Buffer)和通道(Channel),本篇继续NIO相关话题内容,主要就是文件锁.以及比较关键的Selecto ...
- Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较
说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...
- docker+k8s基础篇二
Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...
- Python基础篇(二)_基本数据类型
Python基础篇——基本数据类型 数字类型:整数类型.浮点数类型.复数类型 整数类型:4种进制表示形式:十进制.二进制.八进制.十六进制,默认采用十进制,其他进制需要增加引导符号 进制种类 引导符号 ...
- node基础篇二:模块、路由、全局变量课堂(持续)
今天继续更新node基础篇,今天主要内容是模块.路由和全局变量. 模块这个概念,在很多语言中都有,现在模块开发已经成为了一种潮流,它能够帮助我们节省很多的时间,当然咱们的node自然也不能缺少,看下例 ...
随机推荐
- Spring配置文件详解
转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常有用 spring配置文件是用于指导Sp ...
- unity3d随机地牢生成代码
现在也是处于失业状态,碰巧看到个面试题是要用unity生成个随机地牢,就把做题过程中的思路和代码记录一下吧. 做完了以后我又想了一下,发现其实根本不需要这么麻烦,果然demo里的代码对我的思路影响还是 ...
- 利用JavaScript来实现用动态检验密码强度
平时我们会在某些网站的注册页面或者更改密码的页面发现当我们输入密码时,会有一个类似于进度条的长条进行提示用户输入的密码强度.如下图: 我看到有些人用几张不同的图片来替换,这样似乎可以,但是不太好.所以 ...
- Nudnik Photographer -Ural1260动态规划
Time limit: 1.0 second Memory limit: 64 MB If two people were born one after another with one second ...
- [MISC] JQUERY注意问题之ie8 post缓存
JQUERY 注意问题之 ie8 post缓存 1.设置AJAX,不存缓存 $.ajaxSetup ({ cache: false //关闭AJAX相应的缓存 }); 2.POST的URL加上随机参数 ...
- 23-React Render Element
第23节 React Render Element 1.Element 元素是反应应用程序的最小积木. 元素描述你在屏幕上看到的内容.: const element= <h1>你好,世界& ...
- JITComVCTK无法访问
源代码第一次加载时会遇到JITComVCTK无法访问的问题,这是因为没有注册该第三方插件,需要到文件夹"\CommonFiles\dll\JITComVCTK"下注册,具体方式: ...
- 输入5至10之间的数字(用javaScript实现判断)
输入5至10之间的数字 ----用javaScript实现判断 代码如下: <!DOCTYPE html><html><body> <script>fu ...
- 【leetcode❤python】 303. Range Sum Query - Immutable
#-*- coding: UTF-8 -*- #Tags:dynamic programming,sumRange(i,j)=sum(j)-sum(i-1)class NumArray(object) ...
- Python if 和 for 的多种写法
a, b, c = 1, 2, 3 [对比Cpp里:c = a >b? a:b]这个写法,Python只能常规的空行,缩进吗? 人生苦短,我用python,下面介绍几种if的方便的方法. 1.常 ...