-(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毫秒内调用完成块。什么可以做到这一点?
某些背景,该函数被调用两次,完成块应该调用另一个动画。第二个动画确实在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
因此,其中一个动画正确完成,并在开始制作动画后10秒钟调用该块。
由于在viewDidAddAnnotation中调用了另一个动画,因此可能会立即调用该块,但是,由于可以同时调用许多不同的动画,因此不太可能出现这种情况。
大多数动画仍然只运行几毫秒。有些人跑了3秒钟。不应该运行其他动画。
答案 0 :(得分:3)
可能会立即调用该块,因为在viewDidAddAnnotation中调用了另一个动画
这几乎可以肯定是原因。您可以使用多个动画,但如果两个动画在同一个对象上重叠,则第一个动画会被中断(默认情况下会跳转到结尾,但您可以设置一个选项以从其中恢复)。注释掉你的第二个动画以确认。
答案 1 :(得分:1)
这实际上是一个功能。当没有动画时,动画立即完成。我想知道是否有改变它的选择。
有时这是件好事。事情是在现有动画中没有任何动画,添加的动画需要独立动画。最终结果是添加的pinview动画与现有pinView的动画不同步
例如,执行self.ReloadBut.alpha = (float) random()/RAND_MAX;
可以解决问题。
我想知道是否有更优雅的方式我可以在didAddAnnotationViews上执行整个动画。或者,如果我知道添加了一些新的引脚,我可以隐藏视图。
能够使用现有引脚同时为新添加的引脚设置动画,这真是太棒了。我会考虑一下。