2012-04-05 3 views
13

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

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

Я не уверен, что понимаю, что вы имеете в виду, не будет ли продолжительность анимации 1,0? –

+2

да, но я использую компонент внутри блока, который должен знать продолжительность, и я не хочу передавать продолжительность как переменную – adamsiton

+0

Хороший вопрос +1 жаль, что я не мог помочь. –

ответ

0

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

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

Согласен. Мы уже проходим длительность, тогда зачем нам искать для этого другой путь. – Mrug

2

[CATransaction animationDuration] является то, что вы ищете

+0

К сожалению, это не работает, блок анимации UIView, по-видимому, не работает напрямую с CATransaction. –

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

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]; 
Смежные вопросы