您的位置:首页 > 移动开发 > IOS开发

IOS之秒表计时器

2015-08-27 09:02 489 查看
1.利用xib方式新建一个秒表计数器。

功能实现:
该应用有三个按钮:开始,记次,复位
开始:开始控制着秒表的开始,点击后,按钮文字变成停止,在没有开始的情况下不允许记次操作
记次:可以记录多个你点击的时间,
复位:复位可以让秒表归零

实现效果图如下:







1.
新建一个类,勾选xib,然后新建一个试图监控器,然后加载到根视图中

在AppDelegate.m中代码如下:
//新建一个视图控制器
    MainViewController *myView = [[MainViewController alloc]init];
    //将新建的视图控制器放到根视图中去。
    self.window.rootViewController = myView;


2.
我们在xib文件进行拖控件,两个label 和三个button,第一个label是一个不用操控的,只是一个
题目而已
第二个label是一个现实秒表数据的label
然后是三个按钮,分别用来控制开始,记次,和复位:
视图如下:





3.
在MainViewController.h中声明成员变量:毫秒,秒,分钟:另外还有一个NSTimer类型的timer;来用来接收计时器的方法
以每隔一毫秒调用让成员变成产生变化:
因为我们要和按钮进行交互,所以当我按下按钮的时候,按钮的文本变成了“停止”,这时候就需要一个临时变量。然后
用判断的方法,来对按钮进行更换文本,一般我们定义一个BOOL类型的变量。

然后就是三个按钮控制的方法:
代码如下:
#import <UIKit/UIKit.h>

	@interface MainViewController : UIViewController{
	    
	    
	    int persent;
	    int seconds;
	    int minutes;
	    IBOutlet UILabel *label;
	    BOOL isOn;
	    
	    
	}
	@property (nonatomic,strong )NSTimer *timer;
	- (IBAction)start:(id)sender;
	- (IBAction)record;
	- (IBAction)reset;

	@end


4.
首先我们开始实现方法:
对数据成员进行初始化:然后新建一个计时器,控制时间的不断变化:
代码如下:
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    
    isStop = YES;
    //类方法会自动释放。
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startTimer) userInfo:nil repeats:YES];
    //需要让定时器暂停
    [_timer setFireDate:[NSDate distantFuture]];
    
    // Do any additional setup after loading the view from its nib.
}


5.
在计数器里面我们看到一个方法:“startTimer”,没过1毫秒就调用这个方法,然后在这个方法中我们可以对成员变量
进行操作:代码如下:

-(void)startTimer{
    percens++;
    //没过100毫秒,就让秒+1,然后让毫秒在归零
    if(percens==100){
        seconds++;
        percens = 0;
    }
    if (seconds == 60) {
        minus++;
        seconds = 0;
    }
    //让不断变量的时间数据进行显示到label上面。
    label.text = [NSString stringWithFormat:@"%02d:%02d.%02d",minus,seconds,percens];
}


6.
然后考虑到的就是我们怎么控制的问题了,思路:我们只需把 [_timer setFireDate:[NSDate distantFuture]];
方法中的NSDate修改为当前的时间就可以让计时器立即执行:然后我们在开始按钮关联的方法中进行操作
代码如下:
//sender是触发者,响应者是当前类的对象
//目标动作机制。
//启动
-(IBAction)start:(id)sender{

    UIButton *btn = (UIButton *)sender;
     //如果按钮此时的状态是yes,那么我们按下后就把文本变成“停止”,然后让isStop = NO;
    //最主要的是让[_timer setFireDate:[NSDate date]];让计时器开始运行
    if (isStop) {
        [btn setTitle:@"停止" forState:UIControlStateNormal];
        [_timer setFireDate:[NSDate date]];
        isStop = NO;
    }else{//如果isStop = NO,当按钮按下的时候就让按钮的文本变成“开始”,然后在把isStop = YES;
         //然后让[_timer setFireDate:[NSDate distantFuture]];,让计时器停止运行
        [btn setTitle:@"开始" forState:UIControlStateNormal];
        [_timer setFireDate:[NSDate distantFuture]];
        isStop = YES;
    }
    //设置定时器的启动时间为当前时间。
    //[_timer setFireDate:[NSDate date]];
}


7.
然后我们开始写记录时间的方法,这个方法中需要我们定义两个UILabel,分别用来显示第一次按下的数据和
按下的时候时间的数据。代码如下:
//记次
-(IBAction)record{
    //如果秒表没有启动,则无法点击
    if(isStop)return;
    static int count=0;
    
    UILabel *countLabel = [[UILabel alloc]init];
     //用来显示次数。Y轴不断的向下延伸,260是上一个控件占用的长度
    countLabel.frame = CGRectMake(10, count*30+260, 100, 30);
    countLabel.text = [NSString stringWithFormat:@"记次 %d",++count];
    //NSLog(@"%@",countLabel);
    [self.view addSubview:countLabel];
    
    //记时label
    UILabel *timeLabel = [[UILabel alloc]init];
    //count之所以减去1,因为++count,而次数和时间的数据要显示在同一行
    timeLabel.frame = CGRectMake(220, 260+(count-1)*30, 100, 30);
    timeLabel.text = label.text;
    [self.view addSubview:timeLabel];
}


8.
最后就是我们的复位的方法了这个方法比较简单,只需要把成员变量置0,然后赋值就可以了
代码如下
//复位
-(IBAction)reset{
    percens = 0;
    seconds = 0;
    minus = 0;
   label.text = [NSString stringWithFormat:@"%02d:%02d.%02d",percens,seconds,minus];
    
    
}


9.
缺憾:
1.记次次数过多的时候,的文本显示没有滚动条,所以一个屏幕只能显示数个记录的时间数据
2.在复位的时候,如果开始按钮处于停止的文本,没有实现控制开始按钮让其变为初始值“开始”

10.手写代码实现:
由于源代码和上面的步骤差不多,这里就不做过多的介绍,仅提供源代码:
点击打开链接

介绍结束:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: