立即调用CATransaction完成

时间:2013-11-14 11:01:24

标签: ios caanimation

我正在尝试在CAAnimation完成后执行完成块。但是,似乎在我的动画完成之前调用了动画块。但动画仍然正确。

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

dropAndBounceAnimation是position.y上的CAKeyFrameAnimation,具有固定的持续时间。

4 个答案:

答案 0 :(得分:94)

我不确定这是否真的是正确的修复方法,但是通过在添加图层动画之前设置完成块,可以在正确的时间始终调用完成块。

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

答案 1 :(得分:11)

您需要在添加动画之前设置动画块。

[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 :(得分:5)

这是 Swift 3.0.1,Xcode 8 版本:

CATransaction.begin()

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

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

CATransaction.commit()

答案 3 :(得分:0)

尝试异步启动动画:

DispatchQueue.main.async {
    self.startAnimation()
}

因为如果在调用动画之前进行一些视图设置,它可能会干扰视图绘制。