L'impostazione dell'alfa su UIView imposta l'alfa sulle sue visualizzazioni secondarie che non dovrebbero verificarsi


86

Secondo la documentazione per UIVIew @property(nonatomic) CGFloat alpha

Il valore di questa proprietà è un numero a virgola mobile compreso tra 0,0 e 1,0, dove 0,0 rappresenta totalmente trasparente e 1,0 rappresenta totalmente opaco. Questo valore influisce solo sulla visualizzazione corrente e non influisce su nessuna delle sue visualizzazioni secondarie incorporate.

Ho una vista contenitore configurata come segue:

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

E poi aggiungi le sottoview a "myView"

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

Ma " anotherView " ha alpha sullo schermo (non è opaco come previsto)

Come può essere e cosa si può fare?


Forse l'ordine di aggiunta di visualizzazioni secondarie e l'impostazione di alpha è importante. Prova a giocare con sequenze diverse.
Joride

Aggiungi tutto il codice di creazione di anotherView :) e penso anche che sia un errore di battitura ma sei sicuro di inizializzare self.myView? e aggiungere anotherView tali come[self.self addSubview:self.myView];
iPatel

1
in effetti, la documentazione è corretta: ciò non influirà sulle sue sottoview incorporate e l'alfa delle sottoview è sempre la stessa - ma le visualizzazioni renderizzate hanno un alphavalore che è il valore di tutte le sottoview alpha, moltiplicato. ad esempio, se l'alfa subviews 0.8e alfa del superview era 1.0, ma si cambia a 0.6, l'alfa subviews è sempre lo stesso, 0.8. il valore alfa della sottoview renderizzata viene modificato solo da 0.8a 0.48.
holex

Risposte:


117

Penso che questo sia un bug nella documentazione. Dovresti archiviarlo su bugreport.apple.com.

Tutto quello che posso vedere dopo un po 'di ricerche rapide suggerisce che quello che stai vedendo è come si è sempre comportato, e anche i miei test lo dimostrano.

L'alfa di una vista viene applicata a tutte le viste secondarie.

Forse tutto ciò di cui hai bisogno è, [[UIColor blackColor] colorWithAlphaComponent:0.5]ma in caso contrario dovrai rendere la vista un fratello invece che un bambino.


21
+1. FWIW, penso che i documenti siano probabilmente corretti, anche se estremamente poco chiari (al punto da essere errati per tutti gli scopi pratici). L'alfa delle visualizzazioni secondarie viene influenzato, ma non il valore alfa. Questo è lo stesso comportamento, credo, per la proprietà nascosta. L'impostazione di nascosto nasconde le visualizzazioni secondarie, ma non determina l'impostazione della proprietà nascosta delle visualizzazioni secondarie.
Bjorn Roche

2
avevo bisogno di mostrare una vista qualcosa come uipopover ma in iphone. Devo creare un uiviewcontroller con [[UIColor blackColor] colorWithAlphaComponent: 0.5]. Grazie ha funzionato
Alok

2
Non credo affatto che i documenti siano "discutibilmente corretti". Nel mondo reale, gli sviluppatori leggeranno i documenti e crederanno che i bambini alfa non siano interessati. Quando, in realtà, il risultato composito sarà come se gli alfa fossero stati modificati. È solo un caso di cattiva documentazione.
Womble

43

Non impostare l'alfa direttamente nella vista genitore. Invece di utilizzare la riga di codice sottostante che applicherà la trasparenza a parentview senza influire sulle sue visualizzazioni figlio.

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


questo codice non funziona con gli ultimi ios e xcode. qualcuno ha idee diverse?
Moxarth,

1
Eccellente!! Per swift 4 usa: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Rakesh Yembaram

Ottima soluzione.
iLearner

27

In rapido

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

AGGIORNATO PER SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)

2
Questo non risponde alla domanda posta.
David Berry

Questo mi dà un errore di: "Il valore di tipo 'UIColor' non ha membri 'colorWithAlphaComponent'".
Krivvenz

1
Ciao @Krivvenz, "colorWithAlphaComponent" è stato rinominato "withAlphaComponent". Vedi la mia risposta modificata.
Nazarii Stadnytskyi

questo codice non funziona. non possiamo vedere la vista spinta come trasparente. qualcuno ha qualche altra idea?
Moxarth

21

Impostare l'opacità del colore di sfondo invece di alfa non influirà sulle sue visualizzazioni figlio.

  1. seleziona vista.
  2. vai all'ispettore degli attributi rispetto al colore di sfondo
  3. clicca su "altri"
  4. imposta l'opacità al 30%

Oppure puoi impostare in modo programmatico

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

Questo è tutto. Codifica felice !!!


C'è un modo per farlo a livello di codice?
DCIndieDev

@DCIndieDev Spiacente, non ho trovato l'opacità come proprietà di UIView. Così impostato dallo storyboard.
MRizwan33

Questa è un'ottima risposta. Ha funzionato alla grande.
Joe Susnick,

Questa dovrebbe essere la risposta accettata, ha funzionato secondo necessità. Grazie.
Missa

1
@ MRizwan33 Puoi accedere alla proprietà opacity da [your UIView] .layer.opacity
Missa

16

Se ti piacciono gli storyboard, metti un User Defined Runtime Attributeper la tua visualizzazione in Identity Inspector:

Key Path: backgroundColor, Type: Color, Value:Ad esempio, di colore bianco, con opacità al 50%.


Bella risposta! Nell'ispettore degli attributi ho impostato l'alfa della vista su uno. In Identity Inspector inserisco il percorso della chiave come sopra con Opacity 50%. L'opacità della visualizzazione è ora al 50%, ma l'opacità delle visualizzazioni secondarie è ancora del 100%. Suppongo che alfa e opacità NON siano la stessa cosa.
etayluz

6

La soluzione più semplice come discusso è modificare l'alfa come segue: La versione aggiornata per Xcode 8 Swift 3 è:

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

Obiettivo C:

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

Consulta i documenti per sviluppatori Apple qui: https://developer.apple.com/reference/uikit/uiview/1622417-alpha


sì, l'ho applicato, ma la vista non è diventata trasparente. Ho usato questo codice in precedenza molte volte. ma questa volta non funziona. e mostrando la mia vista come un colore nero solido. quindi qualsiasi metodo alternativo o è cambiato con i nuovi aggiornamenti iOS?
Moxarth,

Molto probabilmente la vista dietro il tuoParentView deve essere completamente nera, per favore controlla il tuo storyboard per xib e anche il tuo codice che se è impostato su nero da qualsiasi altra parte. Spero che questo aiuti
Ankit Kumar Gupta

sto solo spingendo un'altra vista da una vista. la visualizzazione push apparirà trasparente dopo questo codice. l'ho usato molte volte prima. è così semplice. -> settings * set = [[settings alloc] initWithNibName: @ "settings" bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: set animated: YES];
Moxarth,

stai usando xib o storyboard?
Ankit Kumar Gupta

ma ora sto usando questo codice e non funziona. la vista spinto apparirà con un colore solido qualunque sia il colore che abbiamo dato, e non trasparente.
Moxarth,

4

In Swift 4.2 e Xcode 10.1

Non aggiungere colore e valore alfa attraverso lo storyboard. Solo l'approccio programmatico funzionerà in questo caso.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)

@ iOS Grazie, questo mi ha aiutato.
Raghuram,

2

Ecco una soluzione un po 'complessa:

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

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

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

Usa una containervista come superview anotherViewe myViewsono entrambe sottoview in container, anotherViewnon è una sottoview in myView.


2

Per ora c'è solo un modo per rendere trasparente la vista genitore e non mettere nessuna vista figlia all'interno (non mettere nessuna vista come vista secondaria) la vista genitore, mettere quella vista figlia fuori dalla vista genitore. Per rendere trasparente la vista genitore puoi farlo tramite storyboard.

//Transparent the parentView

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

Posiziona l'altra vista al di fuori della vista principale. Funzionerà come un incantesimo.


0

Fare riferimento alla descrizione in grassetto dalla documentazione di Xcode.

Il valore di questa proprietà è un numero a virgola mobile compreso tra 0,0 e 1,0, dove 0,0 rappresenta totalmente trasparente e 1,0 rappresenta totalmente opaco. La modifica del valore di questa proprietà aggiorna solo il valore alfa della vista corrente. Tuttavia, la trasparenza conferita da quel valore alfa influisce su tutti i contenuti della vista, comprese le sue viste secondarie. Ad esempio, una vista secondaria con un valore alfa di 1.0 che è incorporata in una vista principale con un valore alfa di 0,5, appare sullo schermo come se anche il suo valore alfa fosse 0,5.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.