2

我是 iPhone 编程的新手。我正在尝试用一只猫做两个声音做一个简单的窗口。当您单击猫图标时,它应该执行“miaau”,而当您拖动窗口(笔划)时,它应该执行“mrrrr”。它有效,但总是当我尝试让 cat mrrrrr 函数 TouchesBegan 触发并且 cat 也执行“miaaau”时。

怎么做才能让界面识别我只想要抚摸猫,而不是触摸它来执行第一个选项“miaau”?

4

3 回答 3

7

我建议在 touchesBegan 方法中添加一个 NSTimer,时间间隔很小(比如 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 的选项检查文档

于 2011-03-08T06:38:08.387 回答
1

这可能会帮助你

touchesBegan 什么时候变成 touchesMoved?

touchesBegin & touchesMove Xcode Obj C 问题

于 2011-03-08T06:37:03.710 回答
0

Max 的解决方案是正确的。它肯定会奏效。我有另一种选择,请参阅这种方法。

在 .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];
}
于 2011-03-08T07:09:16.737 回答