iOS 倒计时方法

倒计时用到了两种方法:1.NSTimer  2.GCD

设计思路:view上有label和button,label用NSTimer倒计时,button用GCD,点击button同时倒计时,5秒后停止

上代码:

@interface里:

@property (assign,nonatomic)int numer;

@property (strong,nonatomic)NSTimer * timer;

@property (strong,nonatomic)UILabel * label;

@property (strong,nonatomic)UIButton * btn;

viewDidLoad里:

self.view.backgroundColor=[UIColor whiteColor];

self.numer=5;

UILabel * label=[[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];

label.backgroundColor=[UIColor orangeColor];

label.textAlignment=NSTextAlignmentCenter;

label.textColor=[UIColor whiteColor];

[self.view addSubview:label];

self.label=label;

UIButton * btn=[UIButton buttonWithType:UIButtonTypeCustom];

btn.frame=CGRectMake(100, CGRectGetMaxY(label.frame)+20, 100, 100);

btn.backgroundColor=[UIColor redColor];

[btn addTarget:self action:@selector(bbb) forControlEvents:UIControlEventTouchUpInside];

[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

[btn setTitle:@"点击" forState:UIControlStateNormal];

[self.view addSubview:btn];

self.btn=btn;

button方法和NSTimer方法:

-(void)bbb

{

self.timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aaa) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

__block int timeout=5; //倒计时时间

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_source_t timers = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

dispatch_source_set_timer(timers,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行

dispatch_source_set_event_handler(timers, ^{

if(timeout<=0){ //倒计时结束,关闭

dispatch_source_cancel(timers);

dispatch_async(dispatch_get_main_queue(), ^{

//设置界面的按钮显示 根据自己需求设置

[self.btn setTitle:@"点击" forState:UIControlStateNormal];

//btn可以点击

self.btn.userInteractionEnabled=YES;

self.numer=5;

[self.btn addTarget:self action:@selector(bbb) forControlEvents:UIControlEventTouchUpInside];

});

}else{

int minutes = timeout / 60;

int seconds = timeout % 60;

NSString *strTime = [NSString stringWithFormat:@"%d分%.2d秒",minutes, seconds];

dispatch_async(dispatch_get_main_queue(), ^{

//设置界面的按钮显示 根据自己需求设置

[self.btn setTitle:strTime forState:UIControlStateNormal];

//btn禁止点击

self.btn.userInteractionEnabled=NO;

});

timeout--;

}

});

dispatch_resume(timers);

}

-(void)aaa

{

self.numer--;

self.label.text=[NSString stringWithFormat:@"%d",self.numer];

if (self.numer==0) {

[self.timer invalidate];

[email protected]"没啦";

}

}

时间: 2024-10-27 19:23:50

iOS 倒计时方法的相关文章

倒计时方法

function countdown (id, seconds){ var elem = document.getElementById(id); var iniseconds = numseconds = parseInt(seconds) || 60; var downtime; var callback = function (num){ var numhtml = "<i>"+ num +"</i> 重新发送"; elem.setAt

IOS上传图片方法类

IOS上传图片方法类 iPhone开发中遇到上传图片问题,找到多资料,最终封装了一个类,请大家指点,代码如下 // // RequestPostUploadHelper.h // demodes // // Created by 张浩 on 13-5-8. // Copyright (c) 2013年 张浩. All rights reserved. // #import <Foundation/Foundation.h> @interface RequestPostUploadHelper

iOS 处理方法中的可变參数

## iOS 处理方法中的可变參数 近期写了一个自己定义的对话框的demo,想模仿系统的UIAlertView的实现方式.对处理可变參数的时候,遇到了小问题,于是谷歌了一下.写下了处理问题的方法.记录下来,以备后需. 代码实现 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelBu

iOS 处理方法中的可变参数

## iOS 处理方法中的可变参数 最近写了一个自定义的对话框的demo,想模仿系统的UIAlertView的实现方式,对处理可变参数的时候,遇到了小问题,于是谷歌了一下,写下了处理问题的方法,记录下来,以备后需. 代码实现 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelBut

iOS 倒计时NSTimer

项目中可能会遇到有些倒计时的地方 比方 手机验证的时候,验证码一般都会有一个时间限制,此时在输入验证码的地方就须要展示一个倒计时 详细实现方式是使用了iOS 自带的 NSTimer 上代码 首先新建 int secondsCountDown; //倒计时总时长 NSTimer *countDownTimer; UILabel *labelText; 然后详细实现 //创建UILabel 加入到当前view labelText=[[UILabel alloc]initWithFrame:CGRec

iOS开发-方法调用在运行时的过程

方法调用在运行时的过程 如果用实例对象调用实例方法,会到实例的isa指针指向的对象(也就是类对象)操作. 如果调用的是类方法,就会到类对象的isa指针指向的对象(也就是元类对象)中操作. 首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现并执行. 如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应实现执行 如果没找到,去父类指针所指向的对象中执行1,2. 以此类推,如果一直到根类还没找到,转向拦截调用. 如果没有重写拦截调用的方法,程序报错. 以

Unity调用原生(iOS, Android)方法

Unity调用原生程序方法,定义接口(doTestSelector): using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class TestScript : MonoBehaviour { // This tells unity to look up the function FooPluginFunction // inside the static binary

IOS之方法混写(swizzling.)

OC中的混写(swizzling)是指透明地把一个方法换成另外一个.简明的说就是在运行时替换方法.利用方法混写可以改变那些没有源代码的对象(包括系统对象)的行为. 方法混写的代码看起来相对比较直观的,举个例子说明一下,之前做本地化翻译的时候就有用到 swizzling 方法.直接去swizze方法 awakeFromNib 然后替换成自己的方法实现以实现本地化翻译.详细可以看这篇文章:IOS本地化应用程序. 主要用到的代码也就这两句: +(void)load { // Autoload : sw

iOS 倒计时及获取本时区时间

倒计时 在viewDidLoad里写个定时器 [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES]; 然后声明定时器的方法 -(void)timerFireMethod:(NSTimer*)theTimer { //定义一个NSCalendar对象 NSCalendar *cal = [NSCalendar cur