7 votes

Problèmes d'animation de l'alpha de UIView

Je tente d'appliquer un fondu à une UIView que j'ai créée de façon programmatique par-dessus une autre.

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

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

Si au lieu d'utiliser l'alpha, je déplace la UIView, ça marche (je vois la UIView en bas pendant que la UIView en haut glisse), donc le problème semble 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 déjà utilisé des animations alpha précédemment et elles fonctionnaient de cette façon en général...

7voto

Can Poyrazoğlu Points 4951

Essayez de définir opaque sur NO explicitement. J'avais le même problème et en le définissant, j'ai résolu mon problème. Apparemment, les vues opaques ne semblent tout simplement pas bien fonctionner avec l'alpha.

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

2voto

jay Points 1405

Je rencontre le même problème dans mon cas c'est à cause du thread Alors je me retrouve à é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) {
    }];
});

2voto

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

Cela fonctionnera bien, et votre fondu sera plus agréable, en raison de options:UIViewAnimationOptionCurveEaseInOut.

1voto

Une autre pièce du puzzle. Lorsque vous animez des contraintes, vous pouvez définir les nouvelles constantes de contrainte en dehors d'un bloc d'animation, puis appeler layoutIfNeeded à l'intérieur de l'animation.

Avec les opacités des vues, celles-ci doivent être définies directement à l'intérieur du bloc d'animation.

Changez ceci :

//setup des changements de position
myConstraint.constant = 10
myOtherConstraint.constant = 10
//oups, l'alpha s'anime immédiatement
view.alpha = 0.5

UIView.animate(withDuration: 0.25) {
   //les positions des vues sont animées, mais l'alpha ne l'est pas   
   self.view.layoutIfNeeded()
}

à

//setup des changements de position
myConstraint.constant = 10
myOtherConstraint.constant = 10

UIView.animate(withDuration: 0.25) {
   view.alpha = 0.5
   self.view.layoutIfNeeded()
}

1voto

Behdad Points 832

J'ai rencontré exactement le même problème. Dans mon cas, je voulais que la vue soit cachée au départ, donc j'ai défini hidden sur true. J'ai pensé que le changement de la valeur alpha change automatiquement la propriété hidden, mais ce n'était pas le cas.

Donc, si vous souhaitez que la vue soit cachée au départ, définissez son alpha sur 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X