2008-10-22 14 views
27

Estoy intentando hacer que una vista se deslice de arriba hacia abajo. Esto no es gran cosa, usé CABasicAnimation para esto. El problema es cuando quiero eliminar la vista. Yo uso esta animaciónDespués de la animación, la posición de vista se restablece

CABasicAnimation *animation; 
animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
[animation setDelegate:self]; 
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height/2)]; 
animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position]; 
animation.autoreverses = NO; 
animation.repeatCount = 0; 
animation.duration = 0.25; 
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]; 
[self.view.layer addAnimation:animation forKey:@"moveX"]; 

Que anima la vista perfectamente. Pero, después de que termina la animación, mi vista aparece nuevamente. Así que agregué esta línea:

[self.view removeFromSuperview]; 

Lo que elimina la vista, pero sin animación. Así que he decidido añadir el código de eliminación de este delegado:

-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag 

Así que ahora, los trabajos de animación, la vista desaparece, pero a veces, puedo ver la vista aparecen y desaparecen más rápido, es como después de la animación, el aparece la vista, luego se llama al delegado animationDidStop, y la vista desaparece, obviamente esto es horrible. ¿Qué estoy haciendo mal?

Respuesta

15

Bueno, de acuerdo con la muestra de Apple "MoveMe", esto (removedOnCompletion) debería funcionar, sin embargo, parece que no.

Así, agregue estas líneas después de su código:

 
[self.view.layer addAnimation:animation forKey:@"moveX"]; 
self.view.layer.position = [animation.toValue CGPointValue]; 

Esto asegura que después de las carreras de animación, la capa se coloca correctamente.

+0

¿Por qué no lo vi? Gracias, esto resolvió mi problema. Creo que esto es un error, no debería estar haciendo eso, pero al menos funciona. – carlos

+0

Estoy de acuerdo, o nos falta algo, ya que SI FUNCIONA en la muestra. ¡Necesito experimentar más, supongo! –

-2

¿Puede establecer la propiedad oculta de la vista en SÍ?

creo que sería:

self.view.hidden = YES; 

pero podría ser:

[self.view setHidden:YES]; 

que resulta que soy bastante escaso en averiguar la forma correcta de acceder a las propiedades de las propiedades.

+0

Hice esto pero obtuve los mismos resultados. – carlos

+0

Eso es exactamente lo mismo. – Ricardo

0

Configurando la vista a oculto como Rob sugiere que debería hacerlo.

Para propiedades de propiedades me quedaría con el estilo ObjC 2.0 como ya tiene en su código.

set.view.hidden = YES; 
0

Este también me mordió. Desea establecer el indicador eliminadoOnCompletion de la animación en NO. Su valor predeterminado es SÍ, lo que significa que una vez completada la animación, se elimina y la vista vuelve a su estado inicial.

+0

Lo mismo aquí, probé esto y el mismo resultado. Estoy llamando a este código desde la misma vista, cuando presionan un botón. – carlos

66

Podría querer establecer estas propiedades. Causan que la presentación sea preservada al final de la animación.

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;

Entonces el "animationDidStop:" método puede ser utilizado para eliminar la vista al final de la animación:

-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag { 
    if (animation == [containerView.layer animationForKey:@"moveX"]) { 
     // remove view here, add another view and/or start another transition 
    } 
} 
+0

+1! Intenté establecer 'removedOnCompletion' pero no dados. Añadiendo 'fillMode = kCAFillModeForwards' además lo arregló. ¡Estupendo! –

+1

Cuando CA comienza a animar una capa, hace una copia y luego establece incrementalmente propiedades en ella y la vuelve a dibujar. Esta técnica funciona, pero sigue animando la capa de presentación para siempre (con el mismo valor una y otra vez). Si desea dejar que la capa de presentación muera, es posible que desee vincular el colocador de la presentación con el de la capa del modelo. Una forma de hacerlo es usar un puntero de objeto para su propiedad, como un NSValue, en lugar de un primitivo. Luego, cuando la capa de presentación establece la propiedad, la capa del modelo también la recogerá. – AlexChaffee

+0

Nota, probé este método para mi animación del color de fondo, pero a veces producía un parpadeo hacia el color original. Sorprendentemente, el uso de [solución de Ben] (http://stackoverflow.com/a/227798/377384) funcionó (sin parpadeo hasta el momento). –

3

Tenía este problema al realizar varias animaciones en un grupo de animación. Tuve que establecer un par de propiedades en el grupo de animación en sí, no las animaciones individuales.

CAAnimationGroup *animGroup = [CAAnimationGroup animation]; 

// MAKE SURE YOU HAVE THESE TWO LINES. 
animGroup.removedOnCompletion = NO; 
animGroup.fillMode = kCAFillModeForwards; 

animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil]; 
animGroup.duration = tAnimationDuration; 
[tImageView.layer addAnimation:animGroup forKey:nil]; 
Cuestiones relacionadas