• NSTimer与运行循环


    NSTimer准确吗?如果不准确,怎么办?

    通常用来有一点时间跨度的周期性事件的处理! CDADisplayLink

     1 //
     2 //  HMViewController.m
     3 //  08-倒计时
     4 //
     5 //  Created by apple on 14-8-18.
     6 //  Copyright (c) 2014年 itcast. All rights reserved.
     7 //
     8 
     9 #import "HMViewController.h"
    10 
    11 @interface HMViewController () <UIAlertViewDelegate>
    12 
    13 @property (weak, nonatomic) IBOutlet UILabel *counterLabel;
    14 
    15 @property (nonatomic, strong) NSTimer *timer;
    16 @end
    17 
    18 @implementation HMViewController
    19 
    20 /** 开始 */
    21 - (IBAction)start
    22 {
    23     // 倒计时10秒,每秒更新一下Label的显示
    24     // 计时器
    25     /** 
    26      参数说明 
    27      1. 时间间隔,double
    28      2. 监听时钟触发的对象
    29      3. 调用方法
    30      4. userInfo,可以是任意对象,通常传递nil
    31      5. repeats:是否重复
    32      */
    33     self.counterLabel.text = @"10";
    34     
    35     // scheduledTimerWithTimeInterval 方法本质上就是创建一个时钟,
    36     // 添加到运行循环的模式是DefaultRunLoopMode
    37     // ----------------------------------------------
    38     // 1>
    39 //    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:@"hello timer" repeats:YES];
    40     
    41     // ----------------------------------------------
    42     // 2> 与1等价
    43 //    self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
    44 //    // 将timer添加到运行循环
    45 //    // 模式:默认的运行循环模式
    46 //    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    47     
    48     // ----------------------------------------------
    49     // 3>
    50     self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
    51     // 将timer添加到运行循环
    52     // 模式:NSRunLoopCommonModes的运行循环模式(监听滚动模式)
    53     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
    54     //[self updateTimer:self.timer];
    55 }
    56 
    57 /** 时钟更新方法 */
    58 - (void)updateTimer:(NSTimer *)timer
    59 {
    60    // NSLog(@"%s", __func__);
    61     // 1. 取出标签中的数字
    62     int counter = self.counterLabel.text.intValue;
    63     
    64     // 2. 判断是否为零,如果为0,停止时钟
    65     if (--counter < 0) {
    66         // 停止时钟
    67         [self pause];
    68         
    69         // 提示用户,提示框
    70 //        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"开始" message:@"开始啦......" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", @"哈哈", nil];
    71 //
    72 //        [alert show];
    73         [[[UIAlertView alloc] initWithTitle:@"开始" message:@"开始啦......" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", @"哈哈", nil] show];
    74     } else {
    75         // CTRL + I
    76         // 3. 修改数字并更新UI
    77         self.counterLabel.text = [NSString stringWithFormat:@"%d", counter];
    78     }
    79 }
    80 
    81 /** 暂停 */
    82 - (IBAction)pause
    83 {
    84     // 停止时钟,invalidate是唯一停止时钟的方法
    85     // 一旦调用了invalidate方法,timer就无效了,如果再次启动时钟,需要重新实例化
    86     [self.timer invalidate];
    87 }
    88 
    89 #pragma mark - alertView代理方法
    90 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    91 {
    92     NSLog(@"%ldaaa-------", (long)buttonIndex);
    93 }
    94 
    95 @end
      1 //
      2 //  HMViewController.m
      3 //  09-图片轮播器
      4 //
      5 //  Created by apple on 14-8-18.
      6 //  Copyright (c) 2014年 itcast. All rights reserved.
      7 //
      8 
      9 #import "HMViewController.h"
     10 
     11 #define kImageCount     5
     12 
     13 @interface HMViewController () <UIScrollViewDelegate>
     14 @property (nonatomic, strong) UIScrollView *scrollView;
     15 @property (nonatomic, strong) UIPageControl *pageControl;
     16 
     17 @property (nonatomic, strong) NSTimer *timer;
     18 @end
     19 
     20 @implementation HMViewController
     21 
     22 - (UIScrollView *)scrollView
     23 {
     24     if (_scrollView == nil) {
     25         _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 20, 300, 130)];
     26         _scrollView.backgroundColor = [UIColor redColor];
     27         
     28         [self.view addSubview:_scrollView];
     29         
     30         // 取消弹簧效果
     31         _scrollView.bounces = NO;
     32         
     33         // 取消水平滚动条
     34         _scrollView.showsHorizontalScrollIndicator = NO;
     35         _scrollView.showsVerticalScrollIndicator = NO;
     36         
     37         // 要分页
     38         _scrollView.pagingEnabled = YES;
     39         
     40         // contentSize
     41         _scrollView.contentSize = CGSizeMake(kImageCount * _scrollView.bounds.size.width, 0);
     42         
     43         // 设置代理
     44         _scrollView.delegate = self;
     45     }
     46     return _scrollView;
     47 }
     48 
     49 - (UIPageControl *)pageControl
     50 {
     51     if (_pageControl == nil) {
     52         // 分页控件,本质上和scrollView没有任何关系,是两个独立的控件
     53         _pageControl = [[UIPageControl alloc] init];
     54         // 总页数
     55         _pageControl.numberOfPages = kImageCount;
     56         // 控件尺寸
     57         CGSize size = [_pageControl sizeForNumberOfPages:kImageCount];
     58         
     59         _pageControl.bounds = CGRectMake(0, 0, size.width, size.height);
     60         _pageControl.center = CGPointMake(self.view.center.x, 130);
     61         
     62         // 设置颜色
     63         _pageControl.pageIndicatorTintColor = [UIColor redColor];
     64         _pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
     65         
     66         [self.view addSubview:_pageControl];
     67         
     68         // 添加监听方法
     69         /** 在OC中,绝大多数"控件",都可以监听UIControlEventValueChanged事件,button除外" */
     70         [_pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged];
     71     }
     72     return _pageControl;
     73 }
     74 
     75 // 分页控件的监听方法
     76 - (void)pageChanged:(UIPageControl *)page
     77 {
     78     NSLog(@"%d", page.currentPage);
     79     
     80     // 根据页数,调整滚动视图中的图片位置 contentOffset
     81     CGFloat x = page.currentPage * self.scrollView.bounds.size.width;
     82     [self.scrollView setContentOffset:CGPointMake(x, 0) animated:YES];
     83 }
     84 
     85 // 视图加载完成调用,通常用来设置数据
     86 - (void)viewDidLoad
     87 {
     88     [super viewDidLoad];
     89 
     90     // 设置图片
     91     for (int i = 0; i < kImageCount; i++) {
     92         NSString *imageName = [NSString stringWithFormat:@"img_%02d", i + 1];
     93         UIImage *image = [UIImage imageNamed:imageName];
     94         
     95         UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.scrollView.bounds];
     96         imageView.image = image;
     97         
     98         [self.scrollView addSubview:imageView];
     99     }
    100     
    101     // 计算imageView的位置
    102     [self.scrollView.subviews enumerateObjectsUsingBlock:^(UIImageView *imageView, NSUInteger idx, BOOL *stop) {
    103         
    104         // 调整x => origin => frame
    105         CGRect frame = imageView.frame;
    106         frame.origin.x = idx * frame.size.width;
    107         
    108         imageView.frame = frame;
    109     }];
    110 //    NSLog(@"%@", self.scrollView.subviews);
    111     
    112     // 分页初始页数为0
    113     self.pageControl.currentPage = 0;
    114     
    115     // 启动时钟
    116     [self startTimer];
    117 }
    118 
    119 - (void)startTimer
    120 {
    121     self.timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
    122     // 添加到运行循环
    123     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
    124 }
    125 
    126 - (void)updateTimer
    127 {
    128     // 页号发生变化
    129     // (当前的页数 + 1) % 总页数
    130     int page = (self.pageControl.currentPage + 1) % kImageCount;
    131     self.pageControl.currentPage = page;
    132     
    133     NSLog(@"%d", self.pageControl.currentPage);
    134     // 调用监听方法,让滚动视图滚动
    135     [self pageChanged:self.pageControl];
    136 }
    137 
    138 #pragma mark - ScrollView的代理方法
    139 // 滚动视图停下来,修改页面控件的小点(页数)
    140 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    141 {
    142     // 停下来的当前页数
    143     NSLog(@"%@", NSStringFromCGPoint(scrollView.contentOffset));
    144     
    145     // 计算页数
    146     int page = scrollView.contentOffset.x / scrollView.bounds.size.width;
    147     
    148     self.pageControl.currentPage = page;
    149 }
    150 
    151 /**
    152  修改时钟所在的运行循环的模式后,抓不住图片
    153  
    154  解决方法:抓住图片时,停止时钟,送售后,开启时钟
    155  */
    156 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    157 {
    158     NSLog(@"%s", __func__);
    159     // 停止时钟,停止之后就不能再使用,如果要启用时钟,需要重新实例化
    160     [self.timer invalidate];
    161 }
    162 
    163 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    164 {
    165     NSLog(@"%s", __func__);
    166     [self startTimer];
    167 }
    168 
    169 
    170 @end
  • 相关阅读:
    pkg_resources.DistributionNotFound: The 'catkin-pkg==0.4.9' distribution was not found
    gsl库安装
    json ubuntu下安装
    系统安装情况以及深度学习环境搭建
    ros 编程习惯
    ubuntu系统ftp连接 以及ssh连接
    redmine问题
    maven仓库私服配置
    SVN配置管理(trunk、branches、tags)
    Gitolite配置管理和GIT基本操作
  • 原文地址:https://www.cnblogs.com/liqiantu/p/4393369.html
Copyright © 2020-2023  润新知