Touch Drag Inside запускает звук несколько раз, а Touch Up Inside не работает - PullRequest
0 голосов
/ 04 октября 2011

Я пытаюсь создать приложение, в котором должен воспроизводиться короткий образец звука, пока человек, использующий приложение, проводит пальцем по экрану. Когда палец (пальцы) поднят с экрана - звук прекратится.

Это функция, которая запускает звук:

-(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 не работает после того, как я перешел в Drag Event.

Я пытался использовать NSTimer, чтобы создать какой-то способ обработки циклов, но безуспешно.

У вас, ребята, есть хорошие идеи? Я новичок, когда дело доходит до Objective-C, разработки для iPhone и XCode - так откровенен со мной.

1 Ответ

0 голосов
/ 04 октября 2011

Мой совет - создать метод, который зацикливает ваш аудиоклип (любой продолжительности, наложения, приостановки и т. Д.). Настройте метод так, чтобы, когда вы вызывали его для воспроизведения, он воспроизводился так, как вы хотите, до бесконечности.

Метод может выглядеть следующим образом:

-(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 (текущее воспроизведение), которое указывает, воспроизводится ли в данный момент звуковой цикл.

В отличие от использования стандартных распознавателей жестов IBAction, рассмотрите возможность переопределения более общих вызовов сенсорного ответчика, прикосновений к перемещению и прикосновений, округленных в вашем представлении.

В touchesMoved установите BOOL вашего VC на YES, а затем запустите ваш метод зацикливания звука, чтобы начать воспроизведение. Метод «воспроизведения» должен всегда проверять и видеть, воспроизводится ли звук, и только начинать воспроизведение

Также поместите проверку в ваш метод, который возвращает / выходит из вашего метода, когда звуковой цикл уже воспроизводится, это позволит избежать наложения.

В прикосновении к закруглению убейте звук любым способом, который вы выберете, и сбросьте BOOL на NO.

...