一、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:];
     [pageCtrl addTarget:self action:@selector(pageAction:) forControlEvents:UIControlEventTouchUpInside];

     ;
     ;

     imageArray =@[@"tu3", @"tu1", @"tu2", @"tu4", @"tu5"];

     //遍历imageArray数组,添加图片到UIScrollView
     ; i<imageArray.count; i++) {
         NSString *image = [imageArray objectAtIndex:i];

         ScrollPageView *images = [[ScrollPageView alloc] initWithFrame:(CGRect){+width*,imageWidth,imageHeight} setImage:[UIImage imageNamed:image]];
         [scrollView addSubview:images];
     }
 }

 //实现图片自动切换
 - (void)changeImage{
     currentPage = lastPage+;
     [scrollView setContentOffset:(CGPoint){currentPage*,} animated:YES];
     lastPage =currentPage;
     ) {
         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与图片的自动切换的更多相关文章

  1. iOS基础篇(十三)——UITableView(一)重用机制

    UITableView是app开发中常用到的控件,功能很强大,常用于数据的显示.在学习UITableView使用之前,我们先简单了解一下: 1.UITableView的重用机制 UITableView ...

  2. php基础篇-二维数组排序 array_multisort

    原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...

  3. JavaScript笔记基础篇(二)

    基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...

  4. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

  5. NIO相关基础篇二

    转载请注明原创出处,谢谢! 上篇NIO相关基础篇一,主要介绍了一些基本的概念以及缓冲区(Buffer)和通道(Channel),本篇继续NIO相关话题内容,主要就是文件锁.以及比较关键的Selecto ...

  6. node基础篇二:模块、路由、全局变量课堂(持续)

    今天继续更新node基础篇,今天主要内容是模块.路由和全局变量. 模块这个概念,在很多语言中都有,现在模块开发已经成为了一种潮流,它能够帮助我们节省很多的时间,当然咱们的node自然也不能缺少,看下例 ...

  7. ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)

    一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...

  8. ios基础篇(二十七)—— Json解析

    一.什么是Json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使 ...

  9. ios基础篇(二十六)—— UITableViewCell的分组索引与标记

    一.表视图的索引目录 首先要创建一个TableView,之前有说过,这里就不详细说了(参考前面第十四篇). 直接贴代码吧, #import "ViewController.h" @ ...

随机推荐

  1. 剑指Offer 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只 ...

  2. Opencv VideoCapture实时捕捉摄像头信息

    #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; using ...

  3. 【转载】LR提交JSON格式的请求

    需求: 测试一个“修改用户铜板”的接口,这个接口接收JSON格式的请求,返回JSON格式的结果: 必须用PUT方式提交请求: 提交内容:  {"method":"modi ...

  4. [转]DB2 load参数

    本文持续更新,LOAD如何提高parallelism.LOAD SHRLEVEL CHANGE的性能提高. =========================== Every once in a wh ...

  5. window.requestAnimationFrame

    今天小猪在看一个html5的demo时一直在找他的动画是怎么实现的,按照我的理解就应该是调用setInterval来循环调用动画函数来实现.但是在Demo中就是找不到这个函数.干着急的小猪只好一步一步 ...

  6. EXCEL某列长度超过255个字符导入SQL SERVER的处理方法

    问题描述: [Excel 源 [1]] 错误: 输出“Excel 源输出”(9) 上的 输出列“Description 3”(546) 出错.返回的列状态是:“文本被截断,或者一个或多个字符在目标代码 ...

  7. docker入门指南(转载)

    原文: http://bg.biedalian.com/2014/11/20/docker-start.html 关于 docker 今天云平台的同事提到, 现在的运维就是恶性循环, 因为大家都在申请 ...

  8. SGU-169 Numbers(找规律)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=169 解题报告: P(n)定义为n的所有位数的乘积,例如P(1243)=1*2*3* ...

  9. 【COGS &amp; USACO】896. 圈奶牛(凸包)

    http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点 ...

  10. duilib\utils\utils.h(251) : error C2504: “VARIANT”: 未定义基类

    转载:http://blog.csdn.net/SP_daiyq/article/details/44542939?locationNum=3 创建win32应用程序的工程文件,删除不需要的代码,只留 ...