La définition de l'alpha sur UIView définit l'alpha sur ses sous-vues, ce qui ne devrait pas se produire

86

Selon la documentation pour UIVIew @property(nonatomic) CGFloat alpha

La valeur de cette propriété est un nombre à virgule flottante compris entre 0,0 et 1,0, où 0,0 représente totalement transparent et 1,0 représente totalement opaque. Cette valeur affecte uniquement la vue courante et n'affecte aucune de ses sous-vues incorporées.

J'ai une vue de conteneur configurée comme suit:

self.myView.backgroundColor = [UIColor blackColor];
self.myView.alpha = 0.5;
[self addSubview:self.myView];

Et puis ajoutez des sous-vues à «myView»

[myView addSubView anotherView];
anotherView.alpha = 1;
NSLog(@"anotherView alpha = %f",anotherView.alpha); // prints 1.0000 as expected

Mais ' anotherView ' a un alpha à l'écran (il n'est pas opaque comme prévu)

Comment cela peut-il être et que peut-on faire?

Avner Barr
la source
Peut-être que l'ordre d'ajout de sous-vues et de définition de l'alpha est important. Essayez de jouer avec différentes séquences.
Joride
Ajoutez tout le code de création d'un anotherView :) et aussi je pense que c'est une faute de frappe mais êtes-vous sûr de vous initialiser self.myView? et en ajouter un autre Voir comme[self.self addSubview:self.myView];
iPatel
1
en effet, la documentation est correcte: cela n'affectera pas ses sous-vues intégrées et l'alpha des sous-vues est toujours la même - mais les vues rendues ont une alphavaleur qui est la valeur de toutes les sous-vues alpha, multipliée. par exemple , si l'alpha subviews 0.8et alpha de l'superview était 1.0, mais vous changer à 0.6l'alpha subviews est toujours le même, 0.8. la valeur alpha de la sous-vue rendue n'est modifiée que de 0.8à 0.48.
holex

Réponses:

117

Je pense que c'est un bogue dans la documentation. Vous devez le déposer sur bugreport.apple.com.

Tout ce que je peux voir après un peu de recherche rapide suggère que ce que vous voyez, c'est comment il s'est toujours comporté, et mes propres tests le montrent aussi.

L'alpha d'une vue est appliquée à toutes les sous-vues.

Tout ce dont vous avez besoin est peut-être, [[UIColor blackColor] colorWithAlphaComponent:0.5]mais sinon, vous devrez faire de la vue un frère au lieu d'un enfant.

Abhi Beckert
la source
21
+1. FWIW, je pense que les documents sont sans doute corrects, même s'ils sont extrêmement peu clairs (au point d'être incorrects à toutes fins pratiques). L'alpha des sous-vues est affectée, mais pas la valeur alpha. C'est le même comportement, je pense, pour la propriété cachée. La définition de masqué masque les sous-vues, mais n'entraîne pas la définition de la propriété masquée des sous-vues.
Bjorn Roche
2
je devais montrer une vue quelque chose comme uipopover mais dans iphone.Je dois créer un uiviewcontroller avec [[UIColor blackColor] colorWithAlphaComponent: 0.5] .Merci cela a fonctionné
Alok
2
Je ne crois pas du tout que les documents soient "sans doute corrects". Dans le monde réel, les développeurs liront la documentation et croiront que les enfants alphas ne sont pas affectés. Quand, en réalité, le résultat composé sera comme si les alphas avaient été modifiés. C'est juste un cas de mauvaise documentation.
Womble
43

Ne définissez pas l'alpha directement sur la vue parent. Au lieu de cela, utilisez la ligne de code ci-dessous qui appliquera la transparence à la vue parentale sans affecter ses vues enfants.

[parentView setBackgroundColor: [[UIColor clearColor] colorWithAlphaComponent: 0.5]];

VM Anooj
la source
ce code ne fonctionne pas avec les derniers ios et xcode. quelqu'un a des idées différentes?
Moxarth
1
Excellent!! Pour swift 4, utilisez: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Rakesh Yembaram
Excellente solution.
iLearner
27

En rapide

view.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5)

MISE À JOUR POUR SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
Nazarii Stadnytskyi
la source
2
Cela ne répond pas à la question posée.
David Berry
Cela me donne une erreur de: "La valeur de type 'UIColor' n'a pas de membre 'colorWithAlphaComponent'".
Krivvenz
1
Bonjour @Krivvenz, 'colorWithAlphaComponent' a été renommé 'withAlphaComponent'. Voir ma réponse modifiée.
Nazarii Stadnytskyi
ce code ne fonctionne pas. on ne peut pas voir la vue poussée comme transparente. quelqu'un a-t-il une autre idée?
Moxarth
21

Définir l'opacité de la couleur d'arrière-plan au lieu de alpha n'affectera pas ses vues enfants.

  1. sélectionnez la vue.
  2. aller à l'inspecteur d'attributs que la couleur d'arrière-plan
  3. cliquez sur "autres"
  4. définir l'opacité à 30%

Ou vous pouvez définir par programmation

var customView:UIView = UIView()
customView.layer.opacity = 0.3

C'est ça. Bon codage !!!

MRizwan33
la source
Existe-t-il un moyen de le faire par programme?
DCIndieDev
@DCIndieDev Désolé, je n'ai pas trouvé l'opacité comme propriété d'UIView. Donc défini par storyboard.
MRizwan33 le
C'est une excellente réponse. A très bien fonctionné.
Joe Susnick du
Cela devrait être la réponse acceptée, a travaillé au besoin. Merci.
Missa le
1
@ MRizwan33 Vous pouvez accéder à la propriété d'opacity à partir de [votre UIView] .layer.opacity
Missa
16

Si vous aimez les storyboards, mettez un User Defined Runtime Attributepour votre vue dans le Identity Inspector:

Key Path: backgroundColor, Type: Color, Value:Par exemple couleur blanche avec Opacité 50%.

Ralf Hundewadt
la source
Très bonne réponse! Dans l'inspecteur d'attributs, j'ai défini l'alpha de la vue sur un. Dans l'inspecteur d'identité, j'insère le chemin de clé comme ci-dessus avec une opacité de 50%. L'opacité de la vue est maintenant à 50%, mais l'opacité des sous-vues est toujours de 100%. Je suppose que l'alpha et l'opacité ne sont PAS identiques.
etayluz
6

La solution la plus simple comme discuté est de changer l'alpha comme suit: La version mise à jour pour Xcode 8 Swift 3 est:

yourParentView.backgroundColor = UIColor.black.withAlphaComponent(0.4)

Objectif c:

yourParentView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];

Reportez-vous à la documentation Apple Developer ici: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

Ankit Kumar Gupta
la source
oui j'ai appliqué cela, mais la vue n'est pas devenue transparente. J'ai utilisé ce code plusieurs fois plus tôt. mais cette fois ça ne marche pas. et montrant ma vue comme couleur noire solide. alors une autre méthode ou cela a-t-il changé avec les nouvelles mises à jour iOS?
Moxarth
Très probablement, la vue derrière votre yourParentView doit être noire solide, veuillez vérifier votre storyboard pour xib et également votre code pour savoir s'il est défini sur noir de n'importe où ailleurs. J'espère que cela aide
Ankit Kumar Gupta
je pousse juste une autre vue d'un point de vue. la vue poussée apparaîtrait transparente après ce code. je l'ai utilisé plusieurs fois auparavant. c'est aussi simple que cela. -> settings * set = [[settings alloc] initWithNibName: @ "settings" bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: set animé: OUI];
Moxarth
utilisez-vous xib ou storyboard?
Ankit Kumar Gupta
mais maintenant j'utilise ce code et cela ne fonctionne pas. la vue poussée apparaîtra avec une couleur unie quelle que soit la couleur que nous avons donnée, et non transparente.
Moxarth
4

Dans Swift 4.2 et Xcode 10.1

N'ajoutez pas de couleur et de valeur alpha via le storyboard. Seule l'approche programmatique fonctionnera dans ce cas.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
iOS
la source
@iOS Merci, celui-ci m'a aidé.
Raghuram
2

Voici une solution un peu complexe:

UIView *container;
UIView *myView;
UIView *anotherView;

myView.alpha = 0.5;
[container addSubview:myView];

anotherView.alpha = 1;
[container addSubview:anotherView];

Utilisez une containervue en tant que vue supervisée anotherViewet myViewsont toutes deux sous-vue dans container, anotherViewn'est pas une sous-vue dans myView.

likid1412
la source
2

Pour l'instant, il n'y a qu'une seule façon de rendre la vue parent transparente et de ne pas mettre de vues enfants à l'intérieur (ne mettez aucune vue en tant que sous-vue) la vue parent, mettez ces vues enfants en dehors de la vue parent. Pour rendre la vue parent transparente, vous pouvez le faire via le storyboard.

//Transparent the parentView

parentView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)

Placez l'autre vue en dehors de la vue parent. Cela fonctionnera comme un charme.

Purnendu roy
la source
0

Veuillez vous référer à la description en gras de la documentation Xcode.

La valeur de cette propriété est un nombre à virgule flottante compris entre 0,0 et 1,0, où 0,0 représente totalement transparent et 1,0 représente totalement opaque. La modification de la valeur de cette propriété met à jour la valeur alpha de la vue actuelle uniquement. Cependant, la transparence conférée par cette valeur alpha affecte tout le contenu de la vue, y compris ses sous-vues. Par exemple, une sous-vue avec une valeur alpha de 1,0 qui est incorporée dans une vue parent avec une valeur alpha de 0,5, apparaît à l'écran comme si sa valeur alpha est également 0,5.

Danyun Liu
la source