Problèmes d'animation d'UIView alpha

J'essaye d'appliquer un fondu à un UIView que j'ai créé par programme au-dessus d'un autre.

[UIView animateWithDuration:0.5 animations:^(void) { [self.view setAlpha:0]; } completion:^(BOOL finished){ [self.view removeFromSuperview]; }]; 

L'événement terminé est appelé correctement après exactement 0,5 seconde, mais je ne vois aucun fondu (je devrais voir l'UIView en bas).

Si au lieu d'utiliser l'alpha, j'éloigne l'UIView cela fonctionne (je vois le UIView inférieur tandis que le UIView supérieur glisse), donc cela semble être un problème lié à l'alpha, mais je n'arrive pas à comprendre ce qui ne va pas!

 [UIView animateWithDuration:0.5 animations:^(void) { CGRect o = self.view.frame; o.origin.x = 320; self.view.frame = o; } completion:^(BOOL finished){ [self.view removeFromSuperview]; }]; 

J'ai utilisé des animations alpha auparavant et elles fonctionnent de cette façon en général …

Essayez de définir opaque sur NO explicitement. J'ai eu le même problème et le réglage qui a résolu mon problème. Apparemment, les vues opaques ne semblent pas bien jouer avec l'alpha.

Le crédit va cependant au commentaire de Hampus Nilsson.

  [UIView animateWithDuration:0.6 delay:0. options:UIViewAnimationOptionCurveEaseInOut animations:^{ [self.view setAlpha:0]; } completion:^(BOOL finished) { [self.view removeFromSuperview]; }]; 

cela fonctionnera bien, et votre évanouissement sera plus agréable, à cause des options:UIViewAnimationOptionCurveEaseInOut

J'ai rencontré le problème exact. Dans mon cas, je voulais que la vue soit cachée au début, donc je la rends hidden à la true . Je pensais que changer la valeur alpha change automatiquement la propriété hidden , mais ce n'était pas le cas.

Donc, si vous voulez que la vue soit cachée au début, mettez son alpha à 0 .

J'ai eu exactement le même problème, et aucune des suggestions n'a fonctionné pour moi. J'ai surmonté le problème en utilisant l'opacité du calque à la place. C'est le code pour montrer la couche (en utilisant Xamarin, mais vous aurez l'idée):

  //Enter the view fading zoomView.Layer.Opacity = 0; UIApplication.SharedApplication.KeyWindow.RootViewController.View.Add(zoomView); UIView.AnimateNotify( 0.15, // duration () => { zoomView.Layer.Opacity = 1.0f }, (finished) => { } ); 

Et c'est pour éteindre le même zoomView

 UIView.AnimateNotify( 0.15, // duration () => { zoomView.Layer.Opacity = 0; }, (finished) => { if (finished) { zoomView.RemoveFromSuperview(); } } ); 

J'éprouve le même problème dans mon cas à cause du thread Donc je finis par écrire un bloc d'animation dans le thread principal.

 dispatch_async(dispatch_get_main_queue(), ^{ [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{ View.alpha = 0.0f; } completion:^(BOOL finished) { }]; });