2012-04-05 20 views
13

Wewnątrz bloku animacji UIView znajduje się sposób na uzyskanie aktualnego czasu trwania animacji?Sprawdź czas trwania animacji bieżącego bloku animacji

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

Nie jestem pewien, czy rozumiem, co masz na myśli, czy czas trwania animacji nie powinien wynosić 1,0? –

+2

Tak, ale używam komponentu wewnątrz bloku, który musi znać czas trwania, i nie chcę podawać czasu trwania jako zmiennej – adamsiton

+0

Dobre pytanie +1 przepraszam Nie mogłem pomóc. –

Odpowiedz

0

Ponieważ używasz bloki, dlaczego nie tylko uchwycić zmienną z nim?

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

Zgadzam się. Już upływający czas, dlaczego mielibyśmy znaleźć inny sposób na to. – Mrug

2

[CATransaction animationDuration] jest to, czego szukasz

+0

Niestety to nie działa, blok animacji UIView najwyraźniej nie działa bezpośrednio z CATransaction. –

2

można uzyskać bieżącej animacji dość łatwo. Na przykład, utworzenie 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: używać CALayer -actionForKey :, nie -animationForKey:

@Dimitri odpowiedź Bouniol „s nie działa na mnie, gdy wywołana z An An zaatakowany seter wewnątrz bloku animacji. Powodem, z mojego rozumienia, jest to, że system animacji UIView ustawia stan przed rozpoczęciem właściwej animacji (i ustawia sety przed rozpoczęciem właściwej animacji). To, co zadziałało, polegało na wywołaniu podobnej metody-actionForKey: na warstwie. Zwrócona akcja miała ustawiony odpowiedni czas i może być używana tak, jak jest w jego odpowiedzi.

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]; 
Powiązane problemy