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?


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.


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]];


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)

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 !!!


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%.


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


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 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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.