Ответ 1
CAKeyframeAnimation является подклассом CAAnimation. В CAAnimation есть свойство delegate
. Делегат может реализовать метод -animationDidStop:finished:
. Остальное должно быть легко.
Я использую 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:. Пока я устанавливаю задержку равной длительности анимации, тогда это должно быть хорошо.
Есть ли лучший способ? Спасибо!
CAKeyframeAnimation является подклассом CAAnimation. В CAAnimation есть свойство delegate
. Делегат может реализовать метод -animationDidStop:finished:
. Остальное должно быть легко.
Или вы можете заключить свою анимацию с помощью:
[CATransaction begin];
[CATransaction setCompletionBlock:^{
/* what to do next */
}];
/* your animation code */
[CATransaction commit];
И установите блок завершения для обработки того, что вам нужно сделать.
Swift 3 для этого .
CATransaction.begin()
CATransaction.setCompletionBlock {
//Actions to be done after animation
}
//Animation Code
CATransaction.commit()