Внутри блока анимации UIView есть способ получить текущую продолжительность анимации?Узнайте продолжительность анимации текущего блока анимации
[UIView animateWithDuration:1.0 animations:^{
// float duration = ?
}];
Внутри блока анимации UIView есть способ получить текущую продолжительность анимации?Узнайте продолжительность анимации текущего блока анимации
[UIView animateWithDuration:1.0 animations:^{
// float duration = ?
}];
Поскольку вы используете блоки, почему бы просто не захватить переменную с ней?
CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{
CGFloat theDuration = duration;
}];
Согласен. Мы уже проходим длительность, тогда зачем нам искать для этого другой путь. – Mrug
[CATransaction animationDuration]
является то, что вы ищете
К сожалению, это не работает, блок анимации UIView, по-видимому, не работает напрямую с CATransaction. –
Вы можете получить текущую анимацию достаточно легко. Например, создание 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 :, не -animationForKey:
@Dimitri ответ Bouniol «s не работает для меня, когда вызывается из ап затронутый сеттер внутри блока анимации. Причина, по моему мнению, заключается в том, что анимационная система 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];
Я не уверен, что понимаю, что вы имеете в виду, не будет ли продолжительность анимации 1,0? –
да, но я использую компонент внутри блока, который должен знать продолжительность, и я не хочу передавать продолжительность как переменную – adamsiton
Хороший вопрос +1 жаль, что я не мог помочь. –