Подтвердить что ты не робот

Узнайте продолжительность анимации текущего блока анимации

Внутри блока анимации UIView есть способ получить текущую продолжительность анимации?

[UIView animateWithDuration:1.0 animations:^{
    // float duration = ?
}];
4b9b3361

Ответ 1

[CATransaction animationDuration] - это то, что вы ищете

Ответ 2

Вы можете получить текущую анимацию достаточно легко. Например, установив 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];

Ответ 3

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];

Ответ 4

Поскольку вы используете блоки, почему бы просто не захватить переменную с ней?

CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}];