3 つの UIView をアニメーション化する必要があります (フェードイン/フェードアウト)。1 アニメーションの長さは 0.6 秒です (フェードイン/アウトのサイクルは 0.6+0.6 秒です)。しかし、アニメーションを 0.2 秒で起動する必要があります。
- 最初のアニメーションは 0.0 秒で起動する必要があります。
- 2 番目のアニメーションは 0.2 秒で起動する必要があります。
- 3 番目のアニメーションは 0.4 秒で起動する必要があります。
そして、それらはすべて「無期限に」(何らかのトリガーが発生するまで)ループする必要があります。
私が現時点で持っているもの:
- (void)playAnimation {
isAnimated = YES;
[self animateView:firstView afterDelay:0.0];
[self animateView:secondView afterDelay:0.2];
[self animateView:thirdView afterDelay:0.4];
}
- (void)stopAnimation {
isAnimated = NO;
}
- (void)animateView:(UIView *)animatedView afterDelay:(float)delay {
if(isAnimated) {
[UIView animateWithDuration:0.6 delay:delay options:UIViewAnimationOptionTransitionNone
animations:^ {
animatedView.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.6 animations:^ {
animatedView.alpha = 0.0;
} completion:^(BOOL finished) {
[self animateView:animatedView afterDelay:0.0];
}];
}];
}
}
このコードは予期せず動作します。ビュー アニメーションが希望どおりに動作する場合 (位相 0.2 秒) もあれば、同時に開始する場合もあります。これを行う適切な方法は何でしょうか? また、メソッド シグネチャから一部を削除afterDelay:
し、まったく同じ効果で animateView メソッドを起動しようとしました。
[self performSelector:@selector(animateView:) withObject:thirdView afterDelay:0.6];
更新
重いネットワーク処理がバックグラウンドで実行されている場合 (AFNetworking を使用して大きな画像をロードしている場合)、アニメーションが「中断」することに気付きました。アニメーションが少し「フリーズ」するかどうかは気にしませんが(遅延がまったくないことを好みますが)、すべてのアニメーションのフェーズをリンクしたままにします(同じ位相差で)。
問題を理解しやすくするために、グラフを追加しました。Y はアルファ、X は時間です。上位 3 つのグラフ - 必要なもの。下のもの - 私が現在持っているもの。強調表示された領域は、問題が発生する場所です。2 番目のビューのアニメーションが 0.2 秒間フリーズし、3 番目のビューと同期していることがわかります。そのため、同じフェーズで点滅を開始します。これはほんの一例です。アニメーション化できる場合もあれば、3 つのビューすべてがいくつかのアニメーション ラウンドで「同期」し、同じフェーズで点滅する場合もあります。