3

ユーザーが設定した頻度に基づいて、アプリ内のいくつかの画像をフェードイン/フェードアウトするために NSTimer を使用しています。たとえば、ユーザーが頻度を 5 秒に設定した場合、5 秒ごとに次のコードが実行されます。

[UIView animateWithDuration:someInterval
                          delay:0
                        options:UIViewAnimationCurveEaseInOut
                     animations:
                        ^{
                            // UI alpha = ... code here
                        }
                     // off...
                     completion:^(BOOL finished){


                         [UIView animateWithDuration:someOtherInterval
                                               delay:yetAnotherValue
                                             options:UIViewAnimationCurveEaseInOut
                                          animations:
                                            ^{
                                                // UI alpha = ... code here
                                            }
                                          completion:nil
                          ];
                     }
     ];

(正確なコードは重要ではなく、フェードイン/フェードアウトの全体的な考え方だけです。)ただし、StackOverflow やさまざまな Web サイトで多くの人が指摘しているように、NSTimer を使用するとアニメーションが途切れる結果になります。フレームレート。そこで、代わりに CADisplayLink を使用しようとしました:

// in viewDidAppear:
timer_count = 0;
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(checkTimer)];
displayLink.frameInterval = 1;
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

-(void)checkTimer
{
    timer_count++;
    if(timer_count >= 1500)
    {
        [self doFadeInOutAnimation];
        timer_count = 0;
    }
}

ただし、これは望ましい効果がありません。画像は、5 秒ごとにフェードイン/アウトするのを待つのではなく、非常に高速に連続して表示されます。

それを行う適切な方法は何ですか?

4

1 に答える 1

5

checkTimer表示リンクは、約 1/30 秒ごとにコールバック メソッドを呼び出します。それだけです。正確なタイミングは不正確で不明です。最後に電話がかかってきてからの経過時間を追跡し、これが別のアニメーションを実行する時間であることを意味するかどうかを判断するのは、完全にあなた次第です. たとえば、最後のコールバックからの経過時間を知るには、表示リンクのタイムスタンプを使用する必要があります。あなたはそれをしていないので、タイミングがずれています。(また、CADisplayLink が機能しないシミュレータでテストしている場合もあります。デバイスでテストする必要があります。)

ただし、「5 秒ごと」のような大まかな測定では、CADisplayLink は完全に無駄です。CADisplayLink は、アニメーションのすべてのフレームを自分でアニメーション化している場合 (つまり、何かを自分自身で明示的に 1/30 秒ごとに変更している場合) を対象としています。ここでは適切ではありません。タイマーが 5 秒に対してコンマ数秒ずれているかどうかは気にしないので、大したことはありません。現在のコードに固執します。アニメーションが途切れる場合は、その理由を突き止めてください。それはアニメと関係がある、しかし、それはタイマーとは何の関係もありません。結局のところ、単に「開始」と言ってから引退するだけです。さまざまな投稿の内容を誤解しています。彼らは「NSTimerを使用しないでください」とは言っていません。「アニメーションの個々のフレームを指示するためにNSTimerを使用しないでください」と言っています。

于 2014-04-26T23:54:58.943 に答える