立即调用CATransaction完成

Jav*_*che 43 caanimation ios

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

[CATransaction begin];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction setCompletionBlock:completionBlock];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

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

Jav*_*che 97

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

[CATransaction begin];
[CATransaction setCompletionBlock:completionBlock];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

  • 是的,根据[文档](https://developer.apple.com/library/Mac/DOCUMENTATION/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/occ/clm/CATransaction/setCompletionBlock :):"一旦此事务组随后添加*的所有动画*已完成(或已被删除),"保证在主线程上调用的完成块对象".关键部分是"随后添加". (19认同)
  • @albertamg但是,它还指出`如果在提交当前事务组之前没有添加动画(或者将完成块设置为不同的值),则将立即调用该块. (2认同)

Cod*_*aru 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];
Run Code Online (Sandbox Code Playgroud)

这必须在视图上完成该动画后触发完成块.


Vad*_*vin 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()
Run Code Online (Sandbox Code Playgroud)