2012-11-04 88 views
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秒運行,但完成塊被稱爲withhin 5 milisecond。什麼可能做到這一點?

一些背景,函數被調用兩次,完成塊應該調用另一個動畫。第二個動畫確實在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

打印'finished'布爾值。我猜想動畫會以某種方式中斷。(完成,@「Not Finished?」); –

+0

NSAssert這就是那條線的用途。確保完成是真實的。永不休息。 –

+0

當沒有動畫時,動畫可能會立即停止嗎?我不認爲這是事實,但這有可能嗎? –

回答

1

這實際上是一個功能。當沒有動畫時,動畫立即完成。我想知道是否有改變這種情況的選擇。

有時這是一件好事。事情是,雖然現有動畫中沒有動畫,但添加的動畫需要動畫獨立。最終結果是添加的pinview的動畫與現有的pinView的動畫不同步。例如,修復self.ReloadBut.alpha = (float) random()/RAND_MAX;可解決問題。

我不知道是否有更優雅的方式,我可以在didAddAnnotationViews上執行整個動畫。或者我可以有一個隱藏的視圖,以防萬一我知道添加了一些新的引腳。

這是一個很好的能夠使用現有引腳同時動態添加新引腳的靈感。我會考慮一下。

3

這可能是塊被立即調用,因爲另一個動畫被稱爲viewDidAddAnnotation

這是幾乎可以肯定的原因。您可以創建多個動畫,但是如果兩個動畫在同一個對象上重疊,則會中斷第一個動畫(默認情況下跳轉到結尾,但您可以設置一個選項以恢復原來的位置)。註釋掉你的第二個動畫來確認。

+0

這是可能的。我會查的。但是,viewDidAddAnnotation適用於與現有動畫不相交的新註釋。我將包括viewDidAddAnnotation –

+0

如果它像你說的那樣被中斷,爲什麼完成總是對的? –

+0

我會盡力。我已經用更完整的信息更新了這個問題,爲什麼沒有辦法將動畫重疊。 –

相關問題