30秒のオーディオファイルがあり、アニメーションを開始できるように、再生中に12の異なるポイントでコールバックを取得したいと思います。たとえば、1.3、3.2、4.8、9.8、12.3、15.5、18.1、20.4、22.5、24.5、27、および29秒です。iOSでこれを行うにはどうすればよいですか?
1 に答える
iOS/Objective-C でこれを行うには、非常に多くの方法があります。オーディオが再生されたことを保証する実際のオーディオ プレーヤーからのコールバックは必要ないと思います。オーディオの再生に使用しているメカニズムには、オーディオが実際に再生を開始したときのコールバックがある場合があります (同期を改善するため)。
非常に一般的なものは
[self performSelector:@selector(myMethod:) withObject:someArgumentOrNil afterDelay:3.2];
または、検索NSTimer
してその使用方法を確認できます。
または新しいグランドセントラルディスパッチバージョン
double delayInSeconds = 3.2;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"later");
});
新しい OS とマルチコア デバイスを使用している場合は、GCD が適しています。
アニメーション パッケージ (cocos2d など) を使用している場合、タイミング フックも含まれていることがよくあります。
拡張された質問に追加:
すべてのアニメーションが異なる場合、それがあなたがしなければならない作業量です。それらがすべて同じである場合 (またはいくつかが同じである場合)、NSTimer で .1 (たとえば) 秒ごとに呼び出してから、実際に経過した時間をテストし、次のしきい値に達したときにアクションをトリガーすることができます。 . (時間通りに実行されるとは限りません。アプリが CPU を大量に消費している場合は、実行が遅くなる可能性があります。)
if (currentTime >= thresholdTime) {
[self doAnim];
thresholdTime = nextOneInLine;
}
はい、もっと複雑になる場合は、それを処理するためにいくつかのクラスを作成する必要があります。配列を時間順に構築し、キューのように扱います。