52

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

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

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

4

4 回答 4

115

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

[CATransaction begin];
[CATransaction setCompletionBlock:completionBlock];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction commit];
于 2013-11-14T11:01:23.893 回答
14

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

[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];

这必须在视图上的动画完成后触发完成块。

于 2015-04-15T12:13:33.790 回答
7

这是Swift 3.0.1,Xcode 8版本:

CATransaction.begin()

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

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

CATransaction.commit()
于 2016-11-28T14:47:07.030 回答
0

尝试异步启动动画:

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

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

于 2018-05-20T22:51:46.107 回答