web-dev-qa-db-fra.com

Avertissement Xcode: "Cela provoquera un effet cassé jusqu'à ce que l'opacité revienne à 1"

J'ai une cellule prototype et j'ai mis un UIVisualEffectView à l'intérieur de son ContentView. Le style de flou de Visual Effect View est sombre et la vibration est désactivée. Ensuite, j'ai réglé l'alpha de la vue des effets visuels à 0,5 à l'aide de l'IB.

Ensuite, lors de l'exécution, je reçois un avertissement qui dit:

<UIVisualEffectView ...> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.

Je ne pouvais pas comprendre pourquoi cet avertissement était là et comment je pouvais définir correctement cette propriété alpha.

29
aslisabanci

Pour autant que je me souvienne, vous ne pouvez pas changer l'alpha d'une vue d'effet visuel. L'alpha doit toujours être un.

12
user1179321

La question est de savoir ce que vous souhaitez animer. Si c'est l'effet, vous ne pouvez pas l'animer via la propriété alpha. Cependant, depuis iOS 9, vous pouvez l'animer en définissant l'effet dans le bloc d'animation.

UIVisualEffectView* view = [[UIVisualEffectView alloc] initWithFrame:self.view.bounds];
view.effect = nil;
[UIView animateWithDuration:0.3 animations:^{
    view.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
}];

Alternativement, vous pouvez animer l'effet en animant l'alpha de la vue wrapper, comme proposé dans les autres réponses (fonctionne même sur iOS 8).

Si vous souhaitez animer le contenu de la vue d'effet visuel (les sous-vues), animez plutôt la propriété contentView (que vous devez utiliser pour ajouter des sous-vues de la vue d'effet).

[UIView animateWithDuration:0.3 animations:^{
    view.contentView.alpha = 1.0;
}];

Donc, pour résumer, vous ne devriez jamais changer l'alpha de l'UIVisualEffectView lui-même car ce n'est probablement pas ce que vous voulez.

14
zvonicek

L'effet souhaité peut être obtenu en définissant l'alpha de couleur d'arrière-plan plutôt que la vue d'effet visuel. Les sous-vues doivent être ajoutées à la vue de la vue des effets visuels et elles ne sont pas affectées par le flou d'arrière-plan.

L'effet Vibrancy doit être sélectionné dans les options View Effect View ci-dessus.

Voir l'image:

enter image description here

8
Sahil Kapoor

user1179321 a tout à fait raison. Selon la documentation UIVisualEffectView;

Lorsque vous utilisez la classe UIVisualEffectView, évitez les valeurs alpha inférieures à 1. La création de vues partiellement transparentes oblige le système à combiner la vue et toutes les sous-vues associées lors d'une passe de rendu hors écran. Les objets UIVisualEffectView doivent être combinés en tant que partie du contenu sur lequel ils sont superposés afin d'avoir l'air correct. La définition de l'alpha à moins de 1 sur la vue des effets visuels ou sur l'un de ses super-aperçus fait que de nombreux effets semblent incorrects ou ne s'affichent pas du tout.

https://developer.Apple.com/library/ios/documentation/uikit/reference/UIVisualEffectView/index.html

5
Kemal Can Kaynak

Ma solution:

  1. Dupliquez le calque derrière la vue de l'effet visuel. (Dans mon cas, un UIImageView)
  2. Anime la valeur alpha de la vue dupliquée. (par exemple, la forme alpha 1 à 0, montre l'image floue)
1
Bill Chan

On ne sait jamais si le retard est suffisamment long; donc une solution plus simple consiste à faire la présentation dans la prochaine boucle d'exécution.

 dispatch_async(dispatch_get_main_queue(), ^(void){
    [self presentViewController:yourPopoverr animated: YES completion: nil];
  });
0
Phantom59

Si vous présentez le Viewcontroller de manière modale, essayez de désactiver la case d'animation en séquence.

0
vanab