1

アプリで 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];
}

以前にこの問題に遭遇した人はいますか?

4

1 に答える 1

1

-beepメソッドが呼び出されるようにどのようにスケジュールしましたか?

NSTimerデフォルトの入力モードでメインの実行ループに を追加したと思われます。何も聞こえないのは、MKMapViewが指を追跡している間、実行ループが in ではなく in にあるため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を参照してください。

于 2012-11-24T04:00:49.433 に答える