使用touchesmoved时,Touchesbegan总会开火吗?

时间:2011-03-08 06:29:42

标签: iphone touchesbegan touchesmoved

我是iPhone编程的新手。 我正试图做一个简单的窗口,一只猫做两声。当你点击猫图标时它应该做“miaau”,当你拖过窗口(笔划)时它应该是“mrrrr”。 它有效,但总是当我尝试制作猫mrrrrr功能时,TouchesBegan会发生火灾,而猫也会做“miaaau”。

如何让界面识别我只想要中风猫,而不是触摸它做第一个选项,“miaau”?

3 个答案:

答案 0 :(得分:7)

我建议将NSTimer添加到touchesBegan方法,时间间隔较短(比如0.1秒):

BOOL tap_event = NO; //ivar declared in header

-(void) touchesBegan:... {
    tap_event = YES;
    [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(checkTap:) userInfo: nil repeats: NO];
} 

-(void) checkTap:(NSTimer*) t {
     if( tap_event ) //miauu here
     tap_event = NO;
}

-(void) touchesMoved:... {
    tap_event = NO;
     //mrrrr here
}

或者作为选项检查UIGestureRecognizers的文档

答案 1 :(得分:1)

答案 2 :(得分:0)

Max' solution是正确的。它肯定会奏效。我有另一种选择,请看这种方法。

将播放器对象放在.h文件中,然后在viewDidLoad中分配并在dealloc中释放。

-(void) touchesBegan:... {

    //Play the miauu sound.
}

-(void)  touchesMoved:... {
[self.yourPlayer stop];

    //Play mrrrr.
}

修改

.h文件,

AVAudioPlayer *avPlayer1;
AVAudioPlayer *avPlayer2;

.m文件

 -(void) touchesBegan:... {
     NSString *path = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@"wav"];
     avPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
     [avPlayer1 play];
 }

-(void) touchesMoved:... {
    [avPlayer1 stop];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@"wav"];
    avPlayer2 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    [avPlayer2 play];
}

-(void)dealloc
{
    [avPlayer1 release];
    [avPlayer2 release];
    [super dealloc];
}