Ustawienie alfa na UIView ustawia alfa na podglądzie, co nie powinno mieć miejsca

86

Zgodnie z dokumentacją dla UIVIew @property(nonatomic) CGFloat alpha

Wartość tej właściwości to liczba zmiennoprzecinkowa z zakresu od 0,0 do 1,0, gdzie 0,0 oznacza całkowitą przezroczystość, a 1,0 oznacza całkowitą nieprzezroczystość. Ta wartość wpływa tylko na bieżący widok i nie wpływa na żadne z jego osadzonych widoków podrzędnych.

Mam następujący widok kontenera:

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

Następnie dodaj widoki podrzędne do „myView”

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

Ale `` anotherView '' ma alfa na ekranie (nie jest nieprzejrzysty, jak oczekiwano)

Jak to możliwe i co można zrobić?

Avner Barr
źródło
Może ważna jest kolejność dodawania podglądów i ustawiania alfa. Spróbuj grać różnymi sekwencjami.
Joride,
Dodaj cały kod tworzenia anotherView :) i też myślę, że to literówka, ale czy na pewno inicjalizujesz self.myView? i dodaj kolejny widok, taki jak[self.self addSubview:self.myView];
iPatel
1
w rzeczywistości dokumentacja jest poprawna: nie wpłynie to na jej osadzone podwidoki, a alfa podglądów podrzędnych jest zawsze taka sama - ale wyrenderowane widoki mają alphawartość, która jest pomnożoną alphawartością wszystkich podglądów . np jeśli alfa subviews 0.8i alpha Superview był 1.0, ale go zmienić 0.6, alfa subviews jest wciąż ten sam, 0.8. wartość alfa renderowanego widoku podrzędnego jest zmieniana tylko z 0.8na 0.48.
holex

Odpowiedzi:

117

Myślę, że to błąd w dokumentacji. Należy to zgłosić pod adresem bugreport.apple.com.

Wszystko, co widzę po krótkich badaniach, sugeruje, że widzisz, jak zawsze się zachowywał, i moje własne testy również to pokazują.

Alfa widoku jest stosowana do wszystkich widoków podrzędnych.

Być może wszystko, czego potrzebujesz, to, [[UIColor blackColor] colorWithAlphaComponent:0.5]ale jeśli nie, będziesz musiał uczynić widok rodzeństwem zamiast dziecka.

Abhi Beckert
źródło
21
+1. FWIW, myślę, że dokumenty są prawdopodobnie poprawne, jeśli są skrajnie niejasne (do tego stopnia, że ​​są niepoprawne ze wszystkich praktycznych celów). Ma to wpływ na alfa podglądów podrzędnych, ale nie na wartość alfa. Myślę, że jest to takie samo zachowanie w przypadku ukrytej własności. Ustawienie ukrytych powoduje ukrycie widoków podrzędnych, ale nie powoduje ustawienia właściwości ukrytych widoków podrzędnych.
Bjorn Roche
2
Miałem wymóg pokazania widoku czegoś takiego jak uipopover, ale na iPhonie. Muszę stworzyć kontroler uiview z [[UIColor blackColor] colorWithAlphaComponent: 0.5]. dzięki, że zadziałało
Alok
2
Nie wierzę, że doktorzy są w ogóle „prawdopodobnie poprawni”. W prawdziwym świecie programiści przeczytają dokumenty i uwierzą, że dzieci alfy są nienaruszone. Kiedy w rzeczywistości złożony wynik będzie wyglądał tak, jakby alfy zostały zmodyfikowane. To tylko przypadek złej dokumentacji.
Womble
43

Nie ustawiaj alfa bezpośrednio w widoku nadrzędnym. Zamiast tego użyj poniższego wiersza kodu, który zastosuje przezroczystość do widoku nadrzędnego bez wpływu na jego widoki podrzędne.

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

Anooj VM
źródło
ten kod nie działa z najnowszymi systemami iOS i Xcode. ktoś ma inne pomysły?
Moxarth
1
Świetny!! Do użytku w wersji Swift 4: parentView.backgroundColor = UIColor.black.withAlphaComponent (0,5)
Rakesh Yembaram
Świetne rozwiązanie.
iLearner
27

Szybko

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

AKTUALIZACJA DLA SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
Nazarii Stadnytskyi
źródło
2
To nie dotyczy zadanego pytania.
David Berry
To daje mi błąd: „Wartość typu 'UIColor' nie ma elementu członkowskiego 'colorWithAlphaComponent'”.
Krivvenz,
1
Witaj @Krivvenz, nazwa „colorWithAlphaComponent” została zmieniona na „withAlphaComponent”. Zobacz moją zredagowaną odpowiedź.
Nazarii Stadnytskyi
ten kod nie działa. nie widzimy widoku wypychanego jako przezroczystego. czy ktoś ma inny pomysł?
Moxarth
21

Ustawienie Krycia koloru tła zamiast alfa nie wpłynie na jego widoki potomne.

  1. wybierz widok.
  2. przejdź do inspektora atrybutów niż kolor tła
  3. kliknij „inne”
  4. ustaw krycie na 30%

Lub możesz ustawić programowo

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

Otóż ​​to. Miłego kodowania !!!

MRizwan33
źródło
Czy jest jakiś sposób, aby zrobić to programowo?
DCIndieDev
@DCIndieDev Przepraszamy, nie znalazłem krycia jako właściwości UIView. Więc ustawione według scenorysu.
MRizwan33
To świetna odpowiedź. Działało świetnie.
Joe Susnick,
To powinna być akceptowana odpowiedź, działał w razie potrzeby. Dzięki.
Missa
1
@ MRizwan33 Możesz uzyskać dostęp do właściwości opacity z [your UIView] .layer.opacity
Missa
16

Jeśli lubisz scenorysy, umieść User Defined Runtime Attributewidok w Identity Inspector:

Key Path: backgroundColor, Type: Color, Value:Na przykład koloru białego Krycie 50%.

Ralf Hundewadt
źródło
Świetna odpowiedź! W Inspektorze atrybutów ustawiłem wartość alfa widoku na jeden. W Inspektorze tożsamości wstawiam ścieżkę klucza jak wyżej z Kryciem 50%. Krycie widoku wynosi teraz 50%, ale nieprzezroczystość podglądów podrzędnych nadal wynosi 100%. Przypuszczam, że alfa i krycie NIE są tym samym.
etayluz
6

Najprostszym rozwiązaniem omawianym jest zmiana alfy w następujący sposób: Zaktualizowana wersja dla Xcode 8 Swift 3 to:

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

Cel C:

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

Zapoznaj się z dokumentacją programisty Apple tutaj: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

Ankit Kumar Gupta
źródło
tak, zastosowałem to, ale widok nie stał się przezroczysty. Użyłem tego kodu wcześniej wiele razy. ale tym razem nie działa. i pokazując mój widok jako jednolity czarny kolor. więc jakaś alternatywna metoda lub zmieniła się wraz z nowymi aktualizacjami iOS?
Moxarth
Najprawdopodobniej widok za twoim yourParentView musi być jednolicie czarny, sprawdź swoją scenorys pod kątem xib, a także kod, czy jest ustawiony na czarny z dowolnego innego miejsca. Mam nadzieję, że to pomoże
Ankit Kumar Gupta
po prostu popycham inny widok z jednego widoku. widok przekazany byłby przezroczysty po tym kodzie. Używałem go wiele razy wcześniej. to jest takie proste. -> ustawienia * set = [[alokacja ustawień] initWithNibName: @ "settings" bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: set animated: YES];
Moxarth
używasz XIB lub Storyboard?
Ankit Kumar Gupta
ale teraz używam tego kodu i nie działa. widok wypchnięty pojawi się w jednolitym kolorze, niezależnie od tego, który podaliśmy, i nie będzie przezroczysty.
Moxarth
4

W Swift 4.2 i Xcode 10.1

Nie dodawaj koloru i wartości alfa poprzez scenorys. W takim przypadku będzie działać tylko podejście programowe.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
iOS
źródło
@iOS Dziękuję, ten pomógł mi.
Raghuram
2

Oto nieco złożone rozwiązanie:

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

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

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

Użyj containerwidoku jako nadzoru, anotherViewa myViewoba są w widoku podrzędnym container, anotherViewnie jest w widoku podrzędnym myView.

likid1412
źródło
2

Na razie jest tylko jeden sposób, aby widok nadrzędny był przezroczysty i nie umieszczaj żadnych widoków podrzędnych wewnątrz (nie umieszczaj żadnych widoków jako podwidoku) widoku nadrzędnego, umieść te widoki podrzędne poza widokiem nadrzędnym. Aby widok rodzica był przezroczysty, możesz to zrobić za pomocą scenorysu.

//Transparent the parentView

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

Umieść drugi widok poza widokiem nadrzędnym. Będzie działać jak urok.

Purnendu Roy
źródło
0

Zapoznaj się z wytłuszczonym opisem w dokumentacji Xcode.

Wartość tej właściwości to liczba zmiennoprzecinkowa z zakresu od 0,0 do 1,0, gdzie 0,0 oznacza całkowitą przezroczystość, a 1,0 oznacza całkowitą nieprzezroczystość. Zmiana wartości tej właściwości aktualizuje wartość alfa tylko bieżącego widoku. Jednak przezroczystość nadana przez tę wartość alfa wpływa na całą zawartość widoku, w tym podglądy. Na przykład widok podrzędny z wartością alfa równą 1,0, który jest osadzony w widoku nadrzędnym z wartością alfa równą 0,5, pojawia się na ekranie tak, jakby jego wartość alfa również wynosiła 0,5.

Danyun Liu
źródło