2012-04-05 9 views
13

Gibt es in einem UIView-Animationsblock eine Möglichkeit, die Dauer der aktuellen Animation abzurufen?Ermitteln Sie die Animationsdauer des aktuellen Animationsblocks

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

Ich bin mir nicht sicher, ob ich verstehe, was du meinst, wäre die Animationsdauer nicht 1.0? –

+2

ja, aber ich verwende eine Komponente innerhalb des Blocks, der die Dauer wissen muss, und ich möchte nicht die Dauer als Variable – adamsiton

+0

gute Frage geben +1 Entschuldigung, ich konnte nicht helfen. –

Antwort

0

Da Sie Blöcke verwenden, warum erfassen Sie nicht einfach eine Variable damit?

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

Zustimmen. Wir überschreiten bereits die Dauer, warum sollten wir einen anderen Weg dafür finden. – Mrug

2

[CATransaction animationDuration] ist, was Sie für

+0

Leider funktioniert das nicht, der UIView-Animationsblock funktioniert offenbar nicht direkt mit CATransaction. –

2

suchen Sie können die aktuelle Animation leicht genug bekommen. Zum Beispiel die Einrichtung einer 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 verwenden :, nicht -animationForKey:

@Dimitri BOUNIOL ‚s Antwort für mich funktionierte nicht, wenn sie von einem ein genannt betroffener Setter in einem Animationsblock. Der Grund, aus meinem Verständnis, ist, dass das Animationssystem von UIView den Zustand einrichtet, bevor die eigentliche Animation gestartet wird (und Setter vor dem Start der eigentlichen Animation aufruft). Was für mich funktionierte, war das Aufrufen der ähnlichen actionForKey: -Methode auf der Ebene. Die zurückgegebene Aktion hatte die richtige Dauer und kann in ihrer Antwort verwendet werden.

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