Establecer alfa en UIView establece el alfa en sus subvistas, lo que no debería suceder

86

Según la documentación de UIVIew @property(nonatomic) CGFloat alpha

El valor de esta propiedad es un número de punto flotante en el rango de 0.0 a 1.0, donde 0.0 representa totalmente transparente y 1.0 representa totalmente opaco. Este valor afecta solo a la vista actual y no afecta a ninguna de sus subvistas integradas.

Tengo una vista de contenedor configurada de la siguiente manera:

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

Y luego agregue subvistas a 'myView'

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

Pero ' anotherView ' tiene alfa en la pantalla (no es opaco como se esperaba)

¿Cómo puede ser esto y qué se puede hacer?

Avner Barr
fuente
Quizás el orden de agregar subvistas y configurar alfa sea importante. Intenta jugar con diferentes secuencias.
Joride
Agregue todo el código de creación de anotherView :) y también creo que es un error tipográfico, pero ¿está seguro de que inicializa self.myView? y añadir anotherView tales como[self.self addSubview:self.myView];
iPatel
1
de hecho, la documentación es correcta: eso no afectará las subvistas integradas y el alfa de las subvistas es siempre el mismo, pero las vistas renderizadas tienen un alphavalor que es el valor de todas las subvistas alpha, multiplicado. por ejemplo, si el alfa subvistas 0.8y alfa del supervista era 1.0, pero lo cambia a 0.6, la alfa subvistas sigue siendo el mismo, 0.8. el valor alfa de la subvista renderizada se cambia solo de 0.8a 0.48.
holex

Respuestas:

117

Creo que esto es un error en la documentación. Debe archivarlo en bugreport.apple.com.

Todo lo que puedo ver después de una breve investigación sugiere que lo que está viendo es cómo siempre se ha comportado, y mis propias pruebas también lo demuestran.

El alfa de una vista se aplica a todas las subvistas.

Quizás todo lo que necesita es, [[UIColor blackColor] colorWithAlphaComponent:0.5]pero si no, tendrá que hacer que la vista sea un hermano en lugar de un niño.

Abhi Beckert
fuente
21
+1. FWIW, creo que los documentos son posiblemente correctos, aunque extremadamente confusos (hasta el punto de ser incorrectos para todos los propósitos prácticos). El alfa de las subvistas se ve afectado, pero no el valor alfa. Este es el mismo comportamiento, creo, para la propiedad oculta. La configuración oculta oculta las subvistas, pero no provoca que se establezca la propiedad oculta de las subvistas.
Bjorn Roche
2
Tenía el requisito de mostrar una vista, algo como uipopover pero en iphone. Tengo que crear un uiviewcontroller con [[UIColor blackColor] colorWithAlphaComponent: 0.5] .gracias, funcionó
Alok
2
No creo que los documentos sean "posiblemente correctos" en absoluto. En el mundo real, los desarrolladores leerán los documentos y creerán que los niños alfa no se ven afectados. Cuando, en realidad, el resultado compuesto será como si los alfas hubieran sido modificados. Es solo un caso de mala documentación.
Womble
43

No establezca el alfa directamente en la vista principal. En lugar de ello, utilice la siguiente línea de código que aplicará transparencia a la vista principal sin afectar a sus vistas secundarias.

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

Anooj VM
fuente
este código no funciona con las últimas ios y xcode. alguien tiene ideas diferentes?
Moxarth
1
¡¡Excelente!! Para uso rápido 4: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Rakesh Yembaram
Gran solucion
iLearner
27

En rápido

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

ACTUALIZADO PARA SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
Nazarii Stadnytskyi
fuente
2
Esto no aborda la pregunta formulada.
David Berry
Esto me da un error de: "El valor de tipo 'UIColor' no tiene miembro 'colorWithAlphaComponent'".
Krivvenz
1
Hola @Krivvenz, 'colorWithAlphaComponent' ha sido renombrado a 'withAlphaComponent'. Vea mi respuesta editada.
Nazarii Stadnytskyi
este código no funciona. no podemos ver la vista empujada como transparente. ¿Alguien tiene alguna otra idea?
Moxarth
21

Establecer la opacidad del color de fondo en lugar de alfa no afectará sus vistas secundarias.

  1. seleccione ver.
  2. ir al inspector de atributos que el color de fondo
  3. haga clic en "otros"
  4. establecer la opacidad al 30%

O puede configurar mediante programación

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

Eso es. Codificación feliz !!!

MRizwan33
fuente
¿Hay alguna forma de hacer esto mediante programación?
DCIndieDev
@DCIndieDev Lo siento, no he encontrado opacidad como una propiedad de UIView. Así lo establece el guión gráfico.
MRizwan33
Esta es una respuesta genial. Funcionó muy bien.
Joe Susnick
Esta debería ser la respuesta aceptada, Funcionó según sea necesario. Gracias.
Missa
1
@ MRizwan33 Puede acceder a la propiedad de opacidad desde [su UIView] .layer.opacity
Missa
16

Si le gustan los guiones gráficos, coloque un User Defined Runtime Attributepara su vista en Identity Inspector:

Key Path: backgroundColor, por ejemplo Type: Color, Value:color blanco con opacidad 50%.

Ralf Hundewadt
fuente
¡Gran respuesta! En el Inspector de atributos configuré el alfa de la vista en uno. En el Inspector de identidad, inserto la ruta de la clave como arriba con Opacidad 50%. La opacidad de la vista ahora es del 50%, pero la opacidad de las subvistas sigue siendo del 100%. Supongo que el alfa y la opacidad NO son lo mismo.
etayluz
6

La solución más simple como se discutió es cambiar el alfa de la siguiente manera: La versión actualizada para Xcode 8 Swift 3 es:

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

C objetivo:

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

Consulte los documentos para desarrolladores de Apple aquí: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

Ankit Kumar Gupta
fuente
sí, apliqué esto, pero la vista no se volvió transparente. He usado este código antes muchas veces. pero esta vez no funciona. y mostrando mi vista como un color negro sólido. Entonces, ¿algún método alternativo o ha cambiado con las nuevas actualizaciones de iOS?
Moxarth
Lo más probable es que la vista detrás de su yourParentView debe ser de color negro sólido, por favor revise su guión gráfico para xib y también su código para saber si está configurado en negro desde cualquier otro lugar. Espero que esto ayude
Ankit Kumar Gupta
Solo estoy empujando otra vista desde una vista. la vista empujada aparecería transparente después de este código. Lo he usado muchas veces antes. Es tan simple como esto . -> settings * set = [[settings alloc] initWithNibName: @ "settings" bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: set animado: SÍ];
Moxarth
¿estás usando xib o storyboard?
Ankit Kumar Gupta
pero ahora estoy usando este código y no funciona. La vista presionada aparecerá con un color sólido cualquiera que sea el color que hayamos dado, y no transparente.
Moxarth
4

En Swift 4.2 y Xcode 10.1

No agregue color y valor alfa a través del guión gráfico. En este caso, solo el enfoque programático funcionará.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
iOS
fuente
@iOS Gracias, este me ayudó.
Raghuram
2

Aquí hay una solución un poco compleja:

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

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

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

Usar una containervista como supervista anotherViewy myViewambas son subvista en container, anotherViewno es una subvista en myView.

likid1412
fuente
2

Por ahora, solo hay una forma de hacer que la Vista principal sea transparente y no coloque ninguna vista secundaria dentro (no ponga ninguna vista como subvista) la vista principal, coloque las vistas secundarias fuera de la vista principal. Para que la vista de los padres sea transparente, puede hacerlo a través del guión gráfico.

//Transparent the parentView

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

Coloque la otra vista fuera de la vista principal. Funcionará de maravilla.

Purnendu roy
fuente
0

Consulte la descripción en negrita de la documentación de Xcode.

El valor de esta propiedad es un número de punto flotante en el rango de 0.0 a 1.0, donde 0.0 representa totalmente transparente y 1.0 representa totalmente opaco. Cambiar el valor de esta propiedad actualiza el valor alfa de la vista actual únicamente. Sin embargo, la transparencia impartida por ese valor alfa afecta a todos los contenidos de la vista, incluidas sus subvistas. Por ejemplo, una subvista con un valor alfa de 1.0 que está incrustada en una vista principal con un valor alfa de 0.5, aparece en pantalla como si su valor alfa también fuera 0.5.

Danyun Liu
fuente