如何通过触摸一次UICollectionViewCell来播放声音,并通过使用AVAudioPlayer再次触摸相同的UICollectionViewCell来停止相同的声音?
我的代码正确播放声音,但是当我按下单元格时它不会停止它,它只是从头开始循环。我目前的代码如下:
// Sound
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
// Loop
int loopOrNot;
BOOL playing = 0;
if ([loopArray containsObject:saveFavorite]) // YES
{
loopOrNot = -1;
} else {
loopOrNot = 0;
}
// Play soundeffects
if (playing==NO) {
// Init audio with playback capability
// Play sound even in silent mode
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayback
error: nil];
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@.wav", [[NSBundle mainBundle] resourcePath], [mainArray objectAtIndex:indexPath.row]]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
audioPlayer.numberOfLoops = loopOrNot;
if (audioPlayer == nil) {
// NSLog([error description]);
}
else {
[audioPlayer play];
}
playing=YES;
}
else if(playing==YES){
[audioPlayer stop];
playing=NO;
}
}
答案 0 :(得分:1)
那是因为你的playing
变量是该函数的本地变量,并且它的值不会在调用中保留。每次调用函数时,它都会被初始化为NO
。
将该变量移动到您的类声明中。
答案 1 :(得分:1)
在您设置方法的开头:
BOOL playing = 0;
和你的第一个if语句:
if (playing==NO) {
总是如此。
在您的方法的开头添加:
BOOL playing = 0;
这样:
if(playing==YES){
[audioPlayer stop];
playing=NO;
return
}
然后添加设置播放器的代码。 在这种情况下,如果玩家正在播放,则停止并从该功能返回,如果它没有播放,则创建播放器并开始播放。
同样替换此行:
BOOL playing = 0;
与
playing = 0;
并将此声明为ivar
@implementation YourClassName
{
BOOL playing;
}
答案 2 :(得分:1)
这是一种快速的方法(使用Swift 2.0 FYI)。将计数器定义为全局变量并将其设置为0.再次按下该按钮时,停止音频并重置其开始时间。希望这会有所帮助。
func setupAudioPlayerWithFile(file:NSString, type:NSString) -> AVAudioPlayer {
let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
let url = NSURL.fileURLWithPath(path!)
var audioPlayer:AVAudioPlayer?
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
print("NO AUDIO PLAYER")
}
return audioPlayer!
}
@IBAction func buttonTap(sender: AnyObject) {
if (counter%2==0)
{
backMusic = setupAudioPlayerWithFile("Etudes", type: "mp3")
backMusic.play()
}
else
{
backMusic.stop()
backMusic.currentTime = 0.0
}
counter++