2011-08-05 10 views
6

Estoy usando CABasicAnimation para rotar UIImageView y no puedo reanudar la animación en pausa. La animación se inicia en el método viewDidLoad:¿Cómo funciona la solución para detener/reanudar CABasicAnimation?

UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MyImage.png"]]; 
self.myImage = img; 
[self.view addSubview:img]; 
[img release]; 
CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
fullRotation.fromValue = [NSNumber numberWithFloat:0]; 
fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; 
fullRotation.duration = 10; 
fullRotation.repeatCount = LARGE_VAL; 
[img.layer addAnimation:fullRotation forKey:@"360"]; 

Necesito tener sin parar la animación repetible que se reanuda cuando la vista aparece en la pantalla. Así que he leído esta publicación (here) y he implementado la solución provista my apple (solution) para detener y reanudar la animación de la capa. Por lo tanto, he utilizado estos métodos:

-(void)pauseLayer:(CALayer*)layer{ 
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    layer.speed = 0.0; 
    layer.timeOffset = pausedTime; 
} 

-(void)resumeLayer:(CALayer*)layer{ 
    CFTimeInterval pausedTime = [layer timeOffset]; 
    layer.speed = 1.0; 
    layer.timeOffset = 0.0; 
    layer.beginTime = 0.0; 
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    layer.beginTime = timeSincePause; 
} 

Y he añadido estos métodos a viewWillAppear y viewWillDisappear utilizando y pasar la capa de la propiedad myImage:

-(void)viewWillDisappear:(BOOL)animated{ 
    [self pauseLayer:self.myImage.layer]; 
} 

- (void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [self resumeLayer:self.myImage.layer]; 
} 

la imagen no rotación inicial cuando la vista va en la pantalla. Pero luego pongo un UIViewController en la pantalla y luego vuelvo a la vista con la rotación de la imagen. El problema es que la rotación de la imagen no se reanuda cuando la vista aparece en la pantalla. Lo he comprobado: mi imagen La propiedad UIImageView no es nula, se invocan los métodos viewWillDisappear y viewWillAppear. Pero la animación no se está reanudando. ¿He hecho algo mal o me he perdido algo?

Respuesta

6

soluciones, soluciones alternativas y soluciones. Hasta el momento, la solución que tenemos es trabajar a tirar la solución sugerida por excavar/reanudar la capa de animación :), para eliminar todas las animaciones en viewWillDisappear:

[self.myImage.layer removeAllAnimations]; 

y luego empezar una nueva animación en viewWillAppear. Sé que no voy a reanudar el anterior pero, en mi caso, no es tan visible para el ojo humano, así que creo que estaré bien. Pero si alguien tiene la solución provista por Apple, trabaje, por favor comparta.

0

Creo que su problema es la gestión de memoria.

probar este lugar:

UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MyImage.png"]]; 
self.myImage = img; 
[img release]; 

CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
fullRotation.fromValue = [NSNumber numberWithFloat:0]; 
fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; 
fullRotation.duration = 10; 
fullRotation.repeatCount = LARGE_VAL; 
[self.myImage.layer addAnimation:fullRotation forKey:@"360"]; 

[self.view addSubview:self.myImage]; 

Dime si esto funciona.

+0

He comprobado la dirección física de mi vista de la imagen propiedad de objeto (tanto en la vista y su capa) y las direcciones son los mismos cuando se entra viewWillAppear y viewWillDisappear. El objeto de imagen no es versión, porque he comprobado que no es nulo – Centurion

+0

La propiedad myImage tiene atributos no automáticos y de retención. Por lo tanto, el objeto de imagen se conserva después de la asignación inicial self.myImage = img. – Centurion

+0

en movimiento [addSubview self.view: self.myImage] a la parte inferior, no resuelve el problema, animación todavía no se reanuda después de regresar. – Centurion

32

que tenían el mismo problema a la suya. Después de mucho googlear ... obtuve una solución para eso.

En su caso, sólo tiene que añadir el siguiente código al configurar CABasicAnimation:

fullRotation.removedOnCompletion = NO; 

Eso es todo. Espero que funcione para ti.

+1

Actualmente, ya tengo la aplicación en la tienda de aplicaciones. Pero gracias, definitivamente probaré la solución. – Centurion

+1

Esto funcionó para mí –

+1

thnx Younghan. se trabajó para mí. – ashForIos

Cuestiones relacionadas