タイミングがどれほど正確であっても、デバイスが約60Hz(1フレームあたり16.7ミリ秒)よりも頻繁に表示されることはありません。私が見ているように、ここには少なくとも2つのオプションがあります。
1)CADisplayLink
コールバックを使用して、オーディオの再生の進行状況を確認し、タイムリーになったときに各アニメーションをトリガーします。
ディスプレイリンクタイマーは、通常と同様の方法で作成されますNSTimers
。
-(void)viewDidLoad
{
// ...
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(scheduleAnimations:)];
[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)scheduleAnimations:(CADisplayLink *)displayLink
{
// get playback time from player object
// iterate queue of timings
// if the timestamp of a timing is equal to or less than the playback time
// create its animation for immediate execution
// remove it from the queue
}
2)アニメーションのコレクションを作成し、それぞれbeginTime
のプロパティを適切なトリガー時間に設定します(または、暗黙的またはブロックベースのアニメーションを使用している場合は、delay
パラメーターを使用します)。
[CATransaction begin];
// iterate collection of timings
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"key"];
animation.startTime = /* time to trigger animation */
animation.removedOnCompletion = NO;
[layer addAnimation:animation forKey:nil];
[CATransaction commit];