Как указать селектор после завершения CAKeyframeAnimation? - PullRequest
18 голосов
/ 18 марта 2010

Я использую 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"];

Обходной путь, который я рассматривал, который должен работать, но, похоже, не самый лучший способ, - это использовать executeSelector: withObject: afterDelay: в NSObject. Пока я устанавливаю задержку, равную продолжительности анимации, она должна быть в порядке.

Есть ли лучший способ? Спасибо!

Ответы [ 3 ]

35 голосов
/ 19 июня 2012

Или вы можете заключить анимацию в:

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

И установите блок завершения для обработки того, что вам нужно сделать.

21 голосов
/ 18 марта 2010

CAKeyframeAnimation является подклассом CAAnimation. В CAAnimation есть свойство delegate . Делегат может реализовать метод -animationDidStop:finished: . Остальное должно быть легко.

5 голосов
/ 24 января 2017

Свифт 3 синтаксис для этого ответа .

CATransaction.begin()
CATransaction.setCompletionBlock {
    //Actions to be done after animation
}
//Animation Code
CATransaction.commit()
...