元の実装でが使用されていることは知っていますが、継続的に可変の期間で直接animationImages
使用する方法がわかりません。ただし、これは自分で実装するための非常に単純な機能です。その場合、配列内の画像間の動的な継続時間の値をコーディングできます。animationImages
次のコードでは、カスタムステッピング関数に置き換えて、停止が要求された後animationImages
の期間を動的に調整します。これは、ハードエンド時間を指定した元のコードとは少し異なることに注意してください。このコードは、ギアスピンが減速し始めるタイミングを指定します。
本当にハードなアニメーション期間がある場合は、stopTheAnimation
選択した減速係数を考慮して呼び出しを調整できます(減速中は、ステップが指定されたしきい値より遅くなるまで、期間をステップごとに10%増やすだけです)。
// my animation stops when the step duration reaches this value:
#define STOP_THRESHOLD_SECONDS 0.1f
#define NUM_IMAGES 35
@implementation ViewController
{
NSMutableArray *imagesArr;
int currentImage;
BOOL stopRequested;
NSTimeInterval duration;
}
-(void) setupTheAnimation {
stopRequested = NO;
currentImage = 0;
duration = 0.9f / NUM_IMAGES;
[self stepThroughImages];
[self performSelector:@selector(stopTheAnimation) withObject:nil afterDelay:4.0];
}
- (void) stepThroughImages {
self.imgView.image = [imagesArr objectAtIndex: currentImage];
if (currentImage == NUM_IMAGES - 1) {
currentImage = 0;
} else {
currentImage++;
}
if (stopRequested && duration < STOP_THRESHOLD_SECONDS) {
// we're slowing down gradually
duration *= 1.1f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self stepThroughImages];
});
} else if (!stopRequested) {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self stepThroughImages];
});
}
}
-(void) stopTheAnimation {
stopRequested = YES;
}