2012-04-05 10 views
13

Dentro de un bloque de animación UIView, ¿hay alguna forma de obtener la duración de la animación actual?Averigüe la duración de la animación del bloque de animación actual

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

No estoy seguro de entender lo que quiere decir, ¿la duración de la animación no sería 1.0? –

+2

sí, pero estoy usando un componente dentro del bloque que necesita saber la duración, y no quiero pasar la duración como variable – adamsiton

+0

Buena pregunta +1 lo siento, no pude evitarlo. –

Respuesta

0

Dado que está utilizando bloques, ¿por qué no simplemente capturar una variable con él?

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

De acuerdo. Ya estamos pasando la duración, entonces, ¿por qué deberíamos encontrar otra manera para eso? – Mrug

2

[CATransaction animationDuration] es lo que estás buscando

+0

Desafortunadamente eso no funciona, el bloque de animación UIView aparentemente no funciona directamente con CATransaction. –

2

Usted puede obtener la animación actual con bastante facilidad. Por ejemplo, la creación de un 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: utilizar CALayer -actionForKey :, no -animationForKey:

@Dimitri respuesta Bouniol 's no funcionó para mí cuando se llama desde un una setter afectado dentro de un bloque de animación. La razón, desde mi entendimiento, es que el sistema de animación de UIView configura el estado antes de comenzar la animación real (y los iniciadores de llamadas antes de comenzar la animación real). Lo que funcionó para mí fue llamar al método similar -actionForKey: en la capa. La acción devuelta tenía la duración adecuada establecida, y puede usarse tal como está en su respuesta.

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