Durch Festlegen von Alpha in UIView wird das Alpha in den Unteransichten festgelegt, was nicht passieren sollte

84

Nach der Dokumentation für UIVIew @property(nonatomic) CGFloat alpha

Der Wert dieser Eigenschaft ist eine Gleitkommazahl im Bereich von 0,0 bis 1,0, wobei 0,0 für vollständig transparent und 1,0 für vollständig undurchsichtig steht. Dieser Wert wirkt sich nur auf die aktuelle Ansicht und auf keine der eingebetteten Unteransichten aus.

Ich habe eine Containeransicht wie folgt konfiguriert:

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

Fügen Sie dann Unteransichten zu 'myView' hinzu.

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

Aber ' anotherView ' hat Alpha auf dem Bildschirm (es ist nicht wie erwartet undurchsichtig)

Wie kann das sein und was kann getan werden?

Avner Barr
quelle
Möglicherweise ist die Reihenfolge des Hinzufügens von Unteransichten und des Einstellens von Alpha wichtig. Versuchen Sie, mit verschiedenen Sequenzen zu spielen.
Joride
Füge den gesamten Code der Erstellung von anotherView hinzu :) und ich denke auch, dass es ein Tippfehler ist, aber bist du sicher, dass du initialisierst self.myView? und fügen Sie eine andere Ansicht wie[self.self addSubview:self.myView];
iPatel
1
In der Tat ist die Dokumentation korrekt: Dies wirkt sich nicht auf die eingebetteten Unteransichten aus, und das Alpha der Unteransichten ist immer gleich. Die gerenderten Ansichten haben jedoch einen alphaWert, der alle alphaWerte der Unteransichten multipliziert. Wenn z. B. das Alpha der Unteransichten 0.8und das Alpha der Übersicht war 1.0, Sie es jedoch ändern, 0.6ist das Alpha der Unteransichten immer noch dasselbe 0.8. Der Alpha-Wert der gerenderten Unteransicht wird nur von 0.8bis geändert 0.48.
Holex

Antworten:

116

Ich denke, das ist ein Fehler in der Dokumentation. Sie sollten es unter bugreport.apple.com ablegen.

Alles, was ich nach ein paar kurzen Recherchen sehen kann, legt nahe, dass Sie sehen, wie es sich immer verhalten hat, und meine eigenen Tests zeigen es auch.

Das Alpha einer Ansicht wird auf alle Unteransichten angewendet.

Vielleicht brauchen Sie nur, [[UIColor blackColor] colorWithAlphaComponent:0.5]aber wenn nicht, müssen Sie die Ansicht zu einem Geschwister anstatt zu einem Kind machen.

Abhi Beckert
quelle
21
+1. FWIW, ich denke, die Dokumente sind wohl korrekt, wenn auch äußerst unklar (bis zu dem Punkt, dass sie für alle praktischen Zwecke falsch sind). Das Alpha der Unteransichten ist betroffen, nicht jedoch der Alpha-Wert. Ich denke, dies ist das gleiche Verhalten für die versteckte Eigenschaft. Durch das Festlegen versteckter Ausblendungen werden Unteransichten ausgeblendet, die versteckte Eigenschaft von Unteransichten wird jedoch nicht festgelegt.
Björn Roche
2
Ich musste eine Ansicht etwas wie uipopover zeigen, aber in iphone. Ich muss einen uiviewcontroller mit [[UIColor blackColor] colorWithAlphaComponent: 0.5] erstellen. Danke, dass es funktioniert hat
Alok
2
Ich glaube nicht, dass die Dokumente "wohl richtig" sind. In der realen Welt werden Entwickler die Dokumente lesen und glauben, dass Kinderalphas nicht betroffen sind. Wenn in Wirklichkeit das zusammengesetzte Ergebnis so ist, als ob die Alphas modifiziert worden wären. Es ist nur ein Fall von schlechter Dokumentation.
Womble
43

Stellen Sie das Alpha nicht direkt in der übergeordneten Ansicht ein. Verwenden Sie stattdessen die folgende Codezeile, um die übergeordnete Ansicht transparent zu machen, ohne die untergeordneten Ansichten zu beeinträchtigen.

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

Anooj VM
quelle
Dieser Code funktioniert nicht mit den neuesten ios und xcode. hat jemand andere ideen?
Moxarth
1
Ausgezeichnet!! Für Swift 4 verwenden Sie: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Rakesh Yembaram
Tolle Lösung.
iLearner
27

In kurzer Zeit

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

AKTUALISIERT FÜR SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
Nazarii Stadnytskyi
quelle
2
Damit wird die gestellte Frage nicht beantwortet.
David Berry
Dies gibt mir den Fehler: "Der Wert vom Typ 'UIColor' hat kein Mitglied 'colorWithAlphaComponent'".
Krivvenz
1
Hallo @Krivvenz, 'colorWithAlphaComponent' wurde in 'withAlphaComponent' umbenannt. Siehe meine bearbeitete Antwort.
Nazarii Stadnytskyi
Dieser Code funktioniert nicht. Wir können die Push-Ansicht nicht als transparent ansehen. Hat jemand eine andere Idee?
Moxarth
21

Das Festlegen der Deckkraft der Hintergrundfarbe anstelle von Alpha wirkt sich nicht auf die untergeordneten Ansichten aus.

  1. Ansicht auswählen.
  2. Gehen Sie zum Attributinspektor als Hintergrundfarbe
  3. Klicken Sie auf "Andere"
  4. Deckkraft auf 30% einstellen

Oder Sie können programmgesteuert einstellen

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

Das ist es. Viel Spaß beim Codieren !!!

MRizwan33
quelle
Gibt es eine Möglichkeit, dies programmgesteuert zu tun?
DCIndieDev
@DCIndieDev Entschuldigung, ich habe keine Deckkraft als Eigenschaft von UIView gefunden. Also per Storyboard eingestellt.
MRizwan33
Dies ist eine großartige Antwort. Hat super funktioniert.
Joe Susnick
Dies sollte die akzeptierte Antwort sein. Vielen Dank.
Missa
1
@ MRizwan33 Sie können auf die Opazitätseigenschaft von der [Ihrer UIView] .layer.opacity
Missa
15

Wenn Sie Storyboards mögen, geben Sie ein User Defined Runtime Attributefür Ihre Ansicht in das Feld ein Identity Inspector:

Key Path: backgroundColor, Type: Color, Value:ZB weiße Farbe mit Opazität 50%.

Ralf Hundewadt
quelle
Gute Antwort! Im Attributinspektor habe ich das Alpha der Ansicht auf eins gesetzt. Im Identitätsinspektor füge ich den Schlüsselpfad wie oben mit einer Deckkraft von 50% ein. Die Deckkraft der Ansicht liegt jetzt bei 50%, aber die Deckkraft der Unteransichten beträgt immer noch 100%. Ich nehme an, dass Alpha und Deckkraft NICHT ein und dasselbe sind.
Etayluz
6

Die einfachste Lösung besteht darin, das Alpha wie folgt zu ändern: Die aktualisierte Version für Xcode 8 Swift 3 lautet:

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

Ziel c:

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

Weitere Informationen finden Sie in den Apple Developer Docs: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

Ankit Kumar Gupta
quelle
Ja, ich habe dies angewendet, aber die Ansicht wurde nicht transparent. Ich habe diesen Code schon oft verwendet. aber diesmal funktioniert es nicht. und meine Ansicht als feste schwarze Farbe zeigen. Also irgendeine alternative Methode oder hat sie sich mit neuen iOS-Updates geändert?
Moxarth
Höchstwahrscheinlich muss die Ansicht hinter Ihrem yourParentView durchgehend schwarz sein. Überprüfen Sie Ihr Storyboard auf xib und auch Ihren Code, ob es von einem anderen Ort aus auf schwarz eingestellt ist. Hoffe das hilft
Ankit Kumar Gupta
Ich drücke nur eine andere Ansicht von einer Ansicht. Die Push-Ansicht wird nach diesem Code transparent angezeigt. Ich habe es schon oft benutzt. es ist so einfach. -> Einstellungen * set = [[Einstellungen zuweisen] initWithNibName: @ "settings" Bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: animiert setzen: JA];
Moxarth
Verwenden Sie Xib oder Storyboard?
Ankit Kumar Gupta
aber jetzt benutze ich diesen Code und es funktioniert nicht. Die Push-Ansicht wird in der von uns angegebenen Farbe einfarbig und nicht transparent angezeigt.
Moxarth
4

In Swift 4.2 und Xcode 10.1

Fügen Sie keine Farbe und keinen Alpha-Wert über das Storyboard hinzu. In diesem Fall funktioniert nur ein programmatischer Ansatz.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
iOS
quelle
@iOS Danke, dieser hat mir geholfen.
Raghuram
2

Hier ist eine etwas komplexe Lösung:

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

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

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

Verwenden Sie eine containerAnsicht als Übersicht anotherViewund myViewsind beide Unteransichten in container, anotherViewist keine Unteransicht in myView.

likid1412
quelle
2

Derzeit gibt es nur eine Möglichkeit, die übergeordnete Ansicht transparent zu machen und keine untergeordneten Ansichten in die übergeordnete Ansicht einzufügen (keine Ansichten als Unteransicht einzufügen). Diese untergeordneten Ansichten werden außerhalb der übergeordneten Ansicht platziert. Um die übergeordnete Ansicht transparent zu machen, können Sie dies über das Storyboard tun.

//Transparent the parentView

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

Platzieren Sie die andere Ansicht außerhalb der übergeordneten Ansicht. Es wird wie ein Zauber wirken.

Purnendu Roy
quelle
0

Bitte beachten Sie die fett gedruckte Beschreibung in der Xcode-Dokumentation.

Der Wert dieser Eigenschaft ist eine Gleitkommazahl im Bereich von 0,0 bis 1,0, wobei 0,0 für vollständig transparent und 1,0 für vollständig undurchsichtig steht. Durch Ändern des Werts dieser Eigenschaft wird nur der Alpha-Wert der aktuellen Ansicht aktualisiert. Die durch diesen Alpha-Wert verliehene Transparenz wirkt sich jedoch auf den gesamten Inhalt der Ansicht aus, einschließlich der Unteransichten. Beispielsweise wird auf dem Bildschirm eine Unteransicht mit einem Alpha-Wert von 1,0 angezeigt, die in eine übergeordnete Ansicht mit einem Alpha-Wert von 0,5 eingebettet ist, als ob ihr Alpha-Wert ebenfalls 0,5 beträgt.

Danyun Liu
quelle