手指平移MKMapView时,iOS AVAudioPlayer无法播放

时间:2012-11-24 03:35:15

标签: ios audio mkmapview avaudioplayer

我有一个基本的哔声,我在我的应用程序中加载了AVAudioPlayer。

如果我的手指没有平移我的MKMapView,它可以发出哔声。

我的哔哔声设定为每2秒播放一次。

当我开始平移地图视图,并且不要将手指从屏幕上移开时,蜂鸣声停止播放。

我记得NSUrlConnection在滚动表视图时也不会触发,我认为这可能是同样的问题,但我无法弄清楚如何将我的音频播放器添加到正确的运行循环中。

我设置了这样的播放器:

-(void)setupBeep
{
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/beep.mp3", [[NSBundle mainBundle] resourcePath]]];

    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = 0;

    if(error)
    {
        NSLog(@"Error opening sound file: %@", [error localizedDescription]);
    }
}

我正在播放我的声音:

// plays a beeping sound
-(void)beep
{
    [audioPlayer play];
}

之前有人遇到过这个问题吗?

1 个答案:

答案 0 :(得分:1)

您是如何安排调用-beep方法的?

我怀疑您在默认输入模式下向主运行循环添加了NSTimer。你没有听到任何声音的原因是,当MKMapView跟踪你的​​手指时,运行循环不在NSDefaultRunLoopMode中 - 它位于UITrackingRunLoopMode

NSRunLoopCommonModes中尝试安排,其中包括默认和跟踪模式:

NSTimer *timer = [NSTimer timerWithTimeInterval:interval target:self selector:@selector(beep) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

另外,请注意NSTimer保留其目标。重复计时器将自动重新计划,因此您需要调用其-invalidate方法将其从循环中删除并允许目标被释放。

编辑:查看Apple的Threading Programming Guide: Run Loops以获取更详细的解释。