2010-01-05 3 views
31

Je souhaite animer la transition d'une sous-vue à la super vue.Animer removeFromSuperview

I afficher la sous-vue à l'aide:

[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]; 

Les travaux ci-dessus bien. Il va revenir à la vue superbe que je ne reçois pas d'animation:

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

Y at-il quelque chose de différent que je devrais faire pour obtenir le sous-vue pour animer une fois enlevé?

Répondre

23

Je pense que vous devez faire forView:self.view.superview à la place, pour être cohérent avec ce que vous faites lorsque vous ajoutez, car dans ce cas, le self.view est l'enfant, et donc vous auriez besoin de le faire sur le parent.

+0

ça marche très bien ...;) –

97

Si vous ciblage iOS 4.0 vers le haut, vous pouvez utiliser des blocs d'animation à la place:

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

(code ci-dessus provient de Apple's UIView documentation)

+3

Merci. C'est si simple. –

+0

hélas! J'ai toujours pensé que * enlever * prend 0,2 secondes. Mais la suppression se produit instantanément. Le * alpha change *, prend 0,2 secondes. Si nous le redéfinissons à 200 secondes, le retrait de superview sera instantané, mais il ne se produira que 200 secondes plus tard ... – Honey

1

Bien que l'approche avec l'envoi removeFromSuperview message du bloc d'achèvement d'animation fonctionne très bien pour Dans la plupart des cas, il est parfois impossible d'empêcher une vue de quitter immédiatement la hiérarchie des vues.

Par exemple, MKMapView supprime ses sous-vues après avoir reçu le message removeAnnotations, et il n'y a pas d'alternative "animée" pour ce message dans l'API.

Néanmoins le code suivant vous permet de faire tout ce que vous aimez avec un clone visuel d'une vue après qu'il a été retiré de superview ou même désallouée:

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 réponse à Swift:

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