2010-01-05 14 views
31

Me gustaría animar la transición de una subvista a la supervista.Animar removeFromSuperview

puedo mostrar la subvista usando:

[UIView beginAnimations:@"curlup" context:nil]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:.5]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 
[self.view addSubview:self.mysubview.view]; 
[UIView commitAnimations]; 

lo anterior funciona bien. Se va de nuevo a la super vista de que no tengo ningún tipo de animación:

[UIView beginAnimations:@"curldown" context:nil]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:.5]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; 
[self.view removeFromSuperview]; 
[UIView commitAnimations]; 

¿Hay algo diferente que debería hacer para conseguir la subvista para animar cuando se retiran?

Respuesta

23

Creo que necesita hacer forView:self.view.superview en su lugar, para ser coherente con lo que está haciendo cuando está agregando, porque en este caso el self.view es el elemento secundario, por lo que tendría que hacerlo en el elemento primario.

+0

funciona muy bien ...;) –

97

Si se apuntan a iOS 4.0 hacia arriba se puede utilizar bloques de animación en su lugar:

[UIView animateWithDuration:0.2 
    animations:^{view.alpha = 0.0;} 
    completion:^(BOOL finished){ [view removeFromSuperview]; }]; 

(por encima de código proviene de Apple's UIView documentation)

+3

Gracias. Eso es tan simple. –

+0

¡ay! Siempre pensé * quitar * lleva 0.2 segundos. Pero la eliminación ocurre instantáneamente. El * alpha cambia *, toma 0.2 segundos. Si lo configuramos nuevamente en 200 segundos, la eliminación de la supervista sería instantánea, pero no sucederá hasta que hayan transcurrido 200 segundos ... – Honey

1

Aunque el enfoque con el envío de removeFromSuperview mensaje del bloque de terminación de animación trabaja muy bien para la mayoría de los casos, a veces no hay forma de evitar que una vista se elimine inmediatamente de la jerarquía de vistas.

Por ejemplo, MKMapView elimina sus subvistas después de recibir el mensaje removeAnnotations, y no hay una alternativa "animada" para este mensaje en la API.

No obstante, el siguiente código le permite hacer lo que quiera con un clon visual de un punto de vista después de que haya sido retirado de supervista o incluso cancelar la asignación:

UIView * snapshotView = [view snapshotViewAfterScreenUpdates:NO]; 
snapshotView.frame = view.frame; 
[[view superview] insertSubview:snapshotView aboveSubview:view]; 

// Calling API function that implicitly triggers removeFromSuperview for view 
[mapView removeAnnotation: annotation]; 

// Safely animate snapshotView and release it when animation is finished 
[UIView animateWithDuration:1.0 
        snapshotView.alpha = 0.0; 
       } 
       completion:^(BOOL finished) { 
        [snapshotView removeFromSuperview]; 
       }]; 
9

JosephH respuesta en Swift:

UIView.animateWithDuration(0.2, animations: {view.alpha = 0.0}, 
           completion: {(value: Bool) in 
               view.removeFromSuperview() 
              })