我正在尝试使用应用程序的人在屏幕上拖动他/她的手指时应该播放一个简短的声音样本的应用程序。当手指抬离屏幕时 - 声音会停止。
这是触发声音的功能:
-(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 - 和我一起裸露。
答案 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。