Как указать селектор после завершения CAKeyframeAnimation?

Я использую 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 :. Пока я устанавливаю задержку равной продолжительности анимации, все должно быть в порядке.

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


person Daren    schedule 18.03.2010    source источник


Ответы (3)


CAKeyframeAnimation - это подкласс CAAnimation. Существует _ 1_ свойство в CAAnimation. Делегат может реализовать _ 2_ метод. Остальное должно быть легко.

person kennytm    schedule 18.03.2010
comment
Милая, спасибо! Я, должно быть, пропустил это, просматривая документы. - person Daren; 18.03.2010
comment
Вот почему не стоит ссылаться и писать здесь ответ. Все ссылки битые! - person Houman; 24.02.2020

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

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

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

person zskalnik    schedule 19.06.2012

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

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