Tom猫喝牛奶(计时器、帧动画)

1、使用计时器实现Tom猫喝牛奶代码:

@interface ZMSecondViewController ()

@end

@implementation ZMSecondViewController

//不要在视图控制器初始化方法中添加与界面相关的操作,self.view
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //创建背景图片
    catView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    catView.image=[UIImage imageNamed:@"drink_0.jpg"];
    [self.view addSubview:catView];
    
    //喝牛奶的Button
    drinkButton=[UIButton buttonWithType:UIButtonTypeSystem];
    drinkButton.frame=CGRectMake(240, 290, 60, 60);
    [drinkButton addTarget:self action:@selector(drinkClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:drinkButton];
    
    //milk图片
    //子视图的原点坐标以父视图的坐标为准,依然为(0,0);
    milkView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 60, 60)];
    milkView.image=[UIImage imageNamed:@"milk.png"];
    [drinkButton addSubview:milkView];
    
    //返回第一页面
    UIButton *goToFirstButton=[UIButton buttonWithType:UIButtonTypeSystem];
    goToFirstButton.frame=CGRectMake(5, 420, 60, 40);
    [goToFirstButton setTitle:@"Back" forState:UIControlStateNormal];
    [goToFirstButton addTarget:self action:@selector(goBackClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:goToFirstButton];
    
}

//喝牛奶时间触发
- (void)drinkClick
{
    //每次点击 喝牛奶的  button ,如果当前 tom没在喝牛奶,就创建定时器,让它喝牛奶;如果在,就没有操作;
    //timer 为空,表示 当前没有timer ,tom没在喝牛奶
    if(_timer==nil)
    {
        _timer=[NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(drink) userInfo:nil repeats:YES];
        //不调用  fire 方法时,创建定时器之后,会 计时,每隔0.15秒调用一次changePic方法;
        //调用  fire 方法时 ,创建定时器之后,先调用一次changePic方法,之后,计时,每隔0.15秒调用一次changePic方法 ;
        [_timer fire];
        //还是这个方法主流,添加到NSRunLoop中运行
        //将计时器添加到主线程,拖拽其他控件不会让计时器停止运行
        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
    }
}

//计时器绑定,拼接图片连贯动作
- (void)drink
{
    _count++;
    NSString *picture=[NSString stringWithFormat:@"drink_%d.jpg",_count];
    catView.image=[UIImage imageNamed:picture];
    if(_count==80)
    {
        //_conut 归0 ;为了下次点击  button时 ,tom可以再次喝牛奶
        _count=0;
        //如果当前定时器不为空;但是  tom喝牛奶的操作已经结束,_timer依旧在后台运行 ;需要把定时器销毁,赋空值
        if(_timer!=nil)
        {
         // 不销毁timer,依旧在占用内存,timer销毁之后,不为空
         //定时器销毁时,页面就定在最后一张图片显示
        [_timer invalidate];
        //赋空值,是为了 下次点击button的时候,根据空值判断,可以再次创建 timer,让tom再次喝牛奶
        _timer =nil;
        }
    }
}

2、帧动画实现代码:

@interface ZMSecondViewController ()

@end

@implementation ZMSecondViewController
{
    int             i;
    UIImageView     *catView;
    NSMutableArray  *pictureArray;
}
//不要在视图控制器初始化方法中添加与界面相关的操作,self.view
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //创建背景图片
    catView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    catView.image=[UIImage imageNamed:@"drink_0.jpg"];
    [self.view addSubview:catView];
    
    //喝牛奶的Button
    UIButton *drinkButton=[UIButton buttonWithType:UIButtonTypeSystem];
    drinkButton.frame=CGRectMake(240, 290, 60, 60);
    [drinkButton addTarget:self action:@selector(drinkClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:drinkButton];
    
    //milk图片
    //子视图的原点坐标以父视图的坐标为准,依然为(0,0);
    UIImageView *milkView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 60, 60)];
    milkView.image=[UIImage imageNamed:@"milk.png"];
    [drinkButton addSubview:milkView];
    
    //创建汤姆猫喝牛奶图片数组
    pictureArray=[[NSMutableArray alloc] init];
    for(i=1;i<81;i++)
    {
        NSString *imageName=[NSString stringWithFormat:@"drink_%d.jpg",i];
        UIImage *imageDrink=[UIImage imageNamed:imageName];
        [pictureArray addObject:imageDrink];
    }
 
    //返回第一页面
    UIButton *goToFirstButton=[UIButton buttonWithType:UIButtonTypeSystem];
    goToFirstButton.frame=CGRectMake(5, 420, 60, 40);
    [goToFirstButton setTitle:@"Back" forState:UIControlStateNormal];
    [goToFirstButton addTarget:self action:@selector(goBackClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:goToFirstButton];
    
}

//喝牛奶触发事件
- (void)drinkClick
{
    NSLog(@"喝牛奶");
    if(i==80)
    {
        //停止动画  ;停止的时候,显示的图片是 _fireView最初赋值的图片
        //与Timer区别在于,Timer停止时显示最后一张照片,而帧动画停止时显示最初赋值的照片
        [catView stopAnimating];
        i=0;
    }
    else
    {
        //设置图片切换一轮所需要的时间;默认值是 图片的数目* 1/30.0 ;
        catView.animationDuration=8;
        
        //设置图片切换的数组;数组中存放的UIImage的对象
        catView.animationImages=pictureArray;
        
        //设置动画的重复次数,默认值为0,表示无穷大
        catView.animationRepeatCount=1;
        
        //开始动画
        [catView startAnimating];
    }
}

@end

最后,附上效果一览,由于图片过大,只能上传部分,望予谅解,谢谢!


你可能感兴趣的:(Tom猫喝牛奶(计时器、帧动画))