web-dev-qa-db-fra.com

Animation removeFromSuperview

Je voudrais animer la transition d'une sous-vue vers la super vue.

J'affiche la sous-vue en utilisant:

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

Ce qui précède fonctionne bien. Cela revient à la super vue que je ne reçois aucune 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 a-t-il quelque chose de différent que je devrais faire pour que la sous-vue soit animée lorsqu'elle est supprimée?

37
user230949

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 vous devrez donc le faire sur le parent.

28
newacct

Si vous ciblez 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]; }];

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

109
JosephH

Joseph répond dans Swift:

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

Bien que l'approche avec l'envoi d'un message removeFromSuperview à partir du bloc de fin d'animation fonctionne correctement dans la plupart des cas, il n'existe parfois aucun moyen d'empêcher une vue d'être supprimée immédiatement de 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 ce que vous voulez avec un clone visuel d'une vue une fois qu'elle a été supprimée de la vue d'ensemble 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];
                 }];
3
nalexn

Exemple ci-dessous:

func removeSpinningGear(cell: LocalSongsCollectionViewCell) {
    UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveLinear, animations: {
        cell.spinningGearBtn.alpha = 0.0
    }) { _ in
        cell.spinningGearBtn.removeFromSuperview()
    }
}
0
De Zheng