如何在CAKeyframeAnimation完成时指定选择器?

时间:2010-03-18 07:37:31

标签: iphone core-animation cakeyframeanimation catransaction

我正在使用CAKeyframeAnimation为CGPath上的视图设置动画。动画完成后,我希望能够调用其他方法来执行另一个动作。有没有办法做到这一点?

我已经看过使用UIView的setAnimationDidStopSelector:,但是从文档来看,它看起来只适用于在UIView动画块(beginAnimations和commitAnimations)中使用。我也试了一下以防万一,但它似乎没有用。

这是一些示例代码(这是在自定义UIView子类方法中):

// These have no effect since they're not in a UIView Animation Block
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];    

// Set up path movement
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
pathAnimation.duration = 1.0f;

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, self.center.x, self.center.y);

// add all points to the path
for (NSValue* value in myPoints) {
    CGPoint nextPoint = [value CGPointValue];
    CGPathAddLineToPoint(path, NULL, nextPoint.x, nextPoint.y);
}

pathAnimation.path = path;
CGPathRelease(path);

[self.layer addAnimation:pathAnimation forKey:@"pathAnimation"];

我正在考虑应该工作的解决方法,但似乎不是最好的方法,是使用NSObject的performSelector:withObject:afterDelay:。只要我将延迟设置为等于动画的持续时间,那么它应该没问题。

有更好的方法吗?谢谢!

3 个答案:

答案 0 :(得分:35)

或者您可以用以下内容附上动画:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
                   /* what to do next */
               }];
/* your animation code */
[CATransaction commit];

并设置完成块以处理您需要执行的操作。

答案 1 :(得分:21)

CAKeyframeAnimation是CAAnimation的子类。 CAAnimation中有delegate property。代表可以实施-animationDidStop:finished: method。其余的应该很容易。

答案 2 :(得分:5)

answer

Swift 3 语法。

student_id_FK