ユーザーが設定した頻度に基づいて、アプリ内のいくつかの画像をフェードイン/フェードアウトするために 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 秒ごとにフェードイン/アウトするのを待つのではなく、非常に高速に連続して表示されます。
それを行う適切な方法は何ですか?