我正在尝试在CAAnimation完成后执行完成块。但是,似乎在我的动画完成之前调用了动画块。但动画仍然正确。
[CATransaction begin];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction setCompletionBlock:completionBlock];
[CATransaction commit];
dropAndBounceAnimation是position.y上的CAKeyFrameAnimation,具有固定的持续时间。
答案 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()
}
因为如果在调用动画之前进行一些视图设置,它可能会干扰视图绘制。