触摸拖动内部反复触发声音& Touch Up Inside不起作用

时间:2011-10-04 15:38:46

标签: iphone objective-c audio touch drag

我正在尝试使用应用程序的人在屏幕上拖动他/她的手指时应该播放一个简短的声音样本的应用程序。当手指抬离屏幕时 - 声音会停止。

这是触发声音的功能:

-(IBAction) playSound:(id)sender{

NSString *soundPath = [[NSBundle mainBundle]pathForResource:@"sound" ofType:@"wav"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundPath];

newPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:fileURL error:nil];
newPlayer.numberOfLoops = -1;
[newPlayer play];   
}

这是停止声音的功能:

-(IBAction) stopSound{
if ([newPlayer isPlaying]) {
    [newPlayer stop];
}
[newPlayer release];
}

我首先开始使用Touch Down事件,它可以无缝地循环播放声音。此时,stopSound与“Touch Up Inside”活动一起工作。

正如我所说的那样,当用户在屏幕上拖动他/她的手指时,应该产生声音。但是当我试图将playSound功能绑定到“Touch Drag Inside”时,声音会反复循环,而不是当时的声音,这使得它很难使用。更改为拖动事件后,stopSound函数不起作用。

我尝试使用NSTimer来创建某种处理循环的方法,但没有任何成功。

你们有什么好主意吗? 对于Objective-C,iPhone开发和我来说,我是初学者。 XCode - 和我一起裸露。

1 个答案:

答案 0 :(得分:0)

我的建议是创建一个循环你的音频剪辑的方法(无论你想要的持续时间,重叠,暂停等)。设置方法,以便在调用它时可以无限期地播放它。

该方法可能如下所示:

-(void) beginOrContinuePlayingAudioLoop:(BOOL)shouldPlay {

 //if touchesMoved called, shouldPlay will be YES
 //if touchesEnded called, shouldPlay will be NO

 if (shouldPlay == NO) {
 //cease playing
 currentlyPlaying = NO;
 }

if (currentlyPlaying == YES) {

return;

} else {

//begin playing audio
currentlyPlaying = YES;

 }
}

在ViewController类中,定义一个BOOL(CurrentlyPlaying),指示音频循环当前是否正在播放。

与使用预装的IBAction手势识别器相反,请考虑覆盖更通用的触摸响应器调用,touchesMoved和touchesEnded在您的视图上。

在touchesMoved中,将VC的BOOL设置为YES,然后触发音频循环方法以开始播放。 “播放”方法应始终检查并查看音频是否已播放,并且仅开始播放

还要检查在音频循环播放时返回/退出方法的方法,这样可以避免重叠。

在touchesEnded中,通过您选择的任何方法终止音频,并将BOOL重置为NO。