如何在没有延迟计时器进入下一次触摸的情况下延迟调用方法?

时间:2014-02-02 08:23:16

标签: ios iphone

我的意思是,我正在编写一个应用程序,在用户触摸屏幕后,在touchesBegan方法中执行一些操作。然后在2.5秒后它调用另一种方法。我遇到的问题是我不认为计时器停止并在我释放后重新开始并再次点击并触摸。

这是我写的代码:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [UIImageView beginAnimations:nil context:NULL];
    _stan.frame = CGRectMake(20, 70, 111, 124);
    [UIImageView setAnimationDuration:.75];
    [UIImageView commitAnimations];

    [self performSelector:@selector(endJump) withObject:nil afterDelay:2.5];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self endJump];
}

-(void)endJump {
    [UIImageView beginAnimations:nil context:NULL];
    _stan.frame = CGRectMake(20, 110, 111, 124);
    [UIImageView setAnimationDuration:.75];
    [UIImageView commitAnimations];
}

我想要做的就是让我的角色跳跃,然后在2.5秒后,他再次坠落并降落在地面上。发生的事情是它第一次起作用,但在接下来的一些接触和保持中,他早早出现,而不是2.5秒之后。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

performSelector:不会因为您已经调用该方法而取消将来的请求。虽然您可以取消performSelector:,但最好使用NSTimer实例,设置为不重复,在您的触摸开始时创建,invalidate(取消),当您的触摸结束时

答案 1 :(得分:0)

不需要为此创建NSTimer ,因为在他的回答中建议 Wain

相反,你调用以下函数,

[NSObject cancelPreviousPerformRequestsWithTarget:self];

因此,您的最终方法将是 - >

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [UIImageView beginAnimations:nil context:NULL];
    _stan.frame = CGRectMake(20, 70, 111, 124);
    [UIImageView setAnimationDuration:.75];
    [UIImageView commitAnimations];

    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(endJump) withObject:nil afterDelay:2.5];
}