Ответ 1
[CATransaction animationDuration]
- это то, что вы ищете
Внутри блока анимации UIView есть способ получить текущую продолжительность анимации?
[UIView animateWithDuration:1.0 animations:^{
// float duration = ?
}];
[CATransaction animationDuration]
- это то, что вы ищете
Вы можете получить текущую анимацию достаточно легко. Например, установив CATransaction
:
CAAnimation *animation = [self.layer animationForKey:self.layer.animationKeys.firstObject];
[CATransaction begin];
[CATransaction setAnimationDuration:animation.duration];
[CATransaction setAnimationTimingFunction:animation.timingFunction];
// CALayer animation here
[CATransaction commit];
TL; DR: использовать CALayer -actionForKey:, not -animationForKey:
Ответ на@Dimitri Bouniol не работал у меня, когда вызывается из затронутого сеттера внутри блока анимации. Причина, по моему мнению, заключается в том, что система анимации UIView устанавливает состояние перед началом фактической анимации (и устанавливает сеттеры перед началом фактической анимации). То, что сработало для меня, вызывало аналогичный метод -actionForKey: на слое. Возвращаемое действие имеет заданную продолжительность и может быть использовано так же, как и в его ответе.
CAAnimation *animation = (CAAnimation*)
[self.layer [email protected]"position"]; // or property of interest
[CATransaction begin];
[CATransaction setAnimationDuration:animation.duration];
[CATransaction setAnimationTimingFunction:animation.timingFunction];
// CALayer animation here
[CATransaction commit];
Поскольку вы используете блоки, почему бы просто не захватить переменную с ней?
CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{
CGFloat theDuration = duration;
}];