2013-11-14 37 views
34

我試圖在我的CAAnimation完成後執行完成塊。不過,在我的動畫完成之前,似乎動畫塊被調用。動畫仍然正確發生。立即調用CATransaction完成

[CATransaction begin]; 
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"]; 
[CATransaction setCompletionBlock:completionBlock]; 
[CATransaction commit]; 

dropAndBounceAnimation是position.y上的CAKeyFrameAnimation,具有固定的持續時間。

回答

81

我不確定這是否是正確的修復方法,但通過在之前設置完成塊添加該圖層的動畫,可以在正確的時間始終調用完成塊。

[CATransaction begin]; 
[CATransaction setCompletionBlock:completionBlock]; 
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"]; 
[CATransaction commit]; 
+19

的確是這樣,因爲每[文檔】(https://developer.apple.com/library/ Mac/DOCUMENTATION/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#// apple_ref/occ/clm/CATransaction/setCompletionBlock :):「保證被調用的完成塊對象(在主線程上)儘快此交易組隨後添加的所有動畫*已完成(或已被刪除)。「。關鍵部分是「隨後添加」。 – albertamg

+2

@albertamg然而,它也表示'如果在當前事務組被提交之前沒有添加動畫(或者完成塊被設置爲不同的值),該塊將立即被調用。「# – iwasrobbed

+1

@iWasRobbed是,並且解釋爲什麼在動畫完成之前調用該塊(如果在將動畫添加到事務組之後設置了該塊)。 – albertamg

10

您需要在添加動畫之前設置動畫塊。

[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration]; 

[CATransaction setCompletionBlock:^{ 
// ... whatever you want to do when the animation is complete 
}]; 

[self.googleMapsView animateToCameraPosition:[GMSCameraPosition 
        cameraWithLatitude:LATITUDE 
          longitude:LONGITUDE 
            zoom:ZOOM]]; 

[CATransaction commit]; 

這必須在視圖上完成該動畫之後觸發完成塊。希望能幫助到你。大拇指)

2

這裏是夫特3.0.1時,Xcode 8版本:

CATransaction.begin() 

CATransaction.setCompletionBlock({ 
    print("Transaction completed") 
}) 

print("Transaction started") 
view.layer.add(dropAndBounceAnimation, forKey: "appearance") 

CATransaction.commit()