1
-(void) movePinsToDestinations:(NSArray *)destination withCompletion: (void (^)())block
{
    ...
    [UIView animateWithDuration:animationTime animations:^{
        //[self.ReloadBut setTitle:@"Animating " forState:UIControlStateNormal];
        for (BGAddressAnnotation * anExistingAnnotation in existingAnnotations) {
            if (anExistingAnnotation.destination) {
                anExistingAnnotation.coordinate = anExistingAnnotation.destination.coordinate;
            }
            else
            {
                anExistingAnnotation.myView.alpha = 0;
            }
        }
    } completion:^(BOOL finished){
        NSAssert(finished, @"Not Finished?");
        for (BGAddressAnnotation * existingAnnotation in existingAnnotations) {
            if ([existingAnnotation.destination.myBiz isEqual: existingAnnotation.myBiz]) {
                existingAnnotation.arrayOfBusinesses = existingAnnotation.destination.arrayOfBusinesses;
                existingAnnotation.myView.alpha=1;
            }
            else
            {
                [self.theMapView removeAnnotation:existingAnnotation];
            }
        }
//        PO([[self class] PrintAllAnnotations: [self annotationExceptUser]]);
//        PO([[self class] PrintAllAnnotations: destination]);
        PO(@"Reach Completion Block");
        if (block)
        {
            block();
        }
        else
        {
            //[self.ReloadBut setTitle:@"Animating Finish" forState:UIControlStateNormal];
        }
    }];
}

結果:

2012-11-04 20:00:05.800 @"Start Animating": Start Animating
2012-11-04 20:00:05.805 @"Reach Completion Block": Reach Completion Block

アニメーションを10秒間実行するように設定しましたが、完了ブロックは5ミリ秒以内に呼び出されます。おそらくこれを行うことができますか?

背景として、関数は2回呼び出され、完了ブロックは別のアニメーションを呼び出すことになっています。2番目のアニメーションは確かに10秒で完了します。完了ブロックを指定すると、すぐに呼び出されますか?

だから私は効果的にやっています

[self movePinsToDestinations:self.myCache.annotationsInterMediateState withCompletion:^{
    [self movePinsToDestinations:self.myCache.annotationsWeShouldbeDisplaying withCompletion:^{
    }];
}];

アップデート:

好奇心から、アニメーションを数回ネストしました。

[self movePinsToDestinations:self.myCache.annotationsInterMediateState withCompletion:^{
    [self movePinsToDestinations:self.myCache.annotationsWeShouldbeDisplaying withCompletion:^{
        [self movePinsToDestinations:emptyAnnotations withCompletion:^{
            [self movePinsToDestinations:startOff withCompletion:^{
                [self movePinsToDestinations:self.myCache.annotationsInterMediateState withCompletion:^{
                    [self movePinsToDestinations:self.myCache.annotationsWeShouldbeDisplaying withCompletion:^{

                    }];
                }];
            }];
        }];
    }];
}];

結果は次のとおりです。

21:51.9 Start Animating: Start Animating
21:51.9 (animationTime): 10
21:51.9 Reach Completion Block: Reach Completion Block
21:51.9 Start Animating: Start Animating
21:51.9 (animationTime): 10
21:51.9 Reach Completion Block: Reach Completion Block
21:51.9 Start Animating: Start Animating
21:51.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block
22:01.9 Start Animating: Start Animating
22:01.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block
22:01.9 Start Animating: Start Animating
22:01.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block
22:01.9 Start Animating: Start Animating
22:01.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block

したがって、アニメーションの1つが適切に実行され、アニメーションの開始から10秒後にブロックが呼び出されます。

viewDidAddAnnotationで別のアニメーションが呼び出されているため、ブロックがすぐに呼び出される可能性がありますが、同時に多くの異なるアニメーションを呼び出すことができるため、そうではない可能性があります。

ほとんどのアニメーションは、まだほんの数ミリ秒で実行されます。3秒間実行されるものもあります。他のアニメーションは実行されるべきではありません。

4

2 に答える 2

3

viewDidAddAnnotationで別のアニメーションが呼び出されているため、ブロックがすぐに呼び出される可能性があります

これがほぼ間違いなく原因です。複数のアニメーションを実行することもできますが、同じオブジェクトに作用する2つのアニメーションが重なると、最初のアニメーションが中断されます(デフォルトでは最後にジャンプしますが、元の場所から再開するオプションを設定できます)。2番目のアニメーションをコメントアウトして確認します。

于 2012-11-04T13:43:01.433 に答える
1

これは実際には機能です。何もアニメーション化されていない場合、アニメーションはすぐに終了します。それを変更するオプションがあるのだろうか。

時々これは良いことです。問題は、既存のアニメーション内にアニメーション化されたものはありませんが、追加されたアニメーションには独立してアニメーションが必要です。最終結果は、追加されたpinviewのアニメーションが既存のpinViewのアニメーションと同期していないことです。

たとえば self.ReloadBut.alpha = (float) random()/RAND_MAX;、実行すると問題が修正されます。

didAddAnnotationViewsでアニメーション全体を実行できるもっとエレガントな方法があるのだろうか。または、新しいピンがいくつか追加されていることがわかっている場合に備えて、非表示のビューを移動させることもできます。

新しく追加されたピンを既存のピンと同時にアニメーション化できるのは素晴らしいことです。考えておく。

于 2012-11-04T15:15:05.667 に答える