Estoy tratando de agregar una sombra paralela a las vistas que se superponen una encima de la otra, las vistas se colapsan permitiendo que se vea el contenido en otras vistas, en este sentido quiero mantener view.clipsToBounds
ON para que cuando las vistas colapsen, su contenido se recorte.
Esto parece haberme dificultado agregar una sombra paralela a las capas, ya que cuando clipsToBounds
enciendo las sombras también se recortan.
He estado tratando de manipular view.frame
y view.bounds
para agregar una sombra paralela al marco pero permitir que los límites sean lo suficientemente grandes como para abarcarlo, sin embargo, no he tenido suerte con esto.
Aquí está el código que estoy usando para agregar una sombra (esto solo funciona con clipsToBounds
APAGADO como se muestra)
view.clipsToBounds = NO;
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowOffset = CGSizeMake(0,5);
view.layer.shadowOpacity = 0.5;
Aquí hay una captura de pantalla de la sombra que se aplica a la capa gris más clara superior. Con suerte, esto da una idea de cómo se superpondrá mi contenido si clipsToBounds
está APAGADO.
¿Cómo puedo agregar una sombra a UIView
mi contenido y mantenerlo recortado?
Editar: Solo quería agregar que también he jugado con el uso de imágenes de fondo con sombras, lo que funciona bien, sin embargo, aún me gustaría saber cuál es la mejor solución codificada para esto.
masksToBounds = NO;
a mi original, con ambos intentos, mantuveclipsToBounds = YES;
ENCENDIDO, ambos no pudieron recortar el contenido. aquí hay una captura de pantalla de lo que sucedió con su ejemplo> youtu.be/tdpemc_XdpsUIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds cornerRadius:5.0];
. No probado, pero debería producir el resultado que desea.layoutSubviews()
. Y si no compensamos en ese lugar ajustando elshadowPath
para reflejar el tamaño actual, tendríamos una vista redimensionada, pero la sombra seguiría siendo el tamaño anterior (inicial) y no se mostraría o asomarse donde no debería. .La respuesta de Wasabii en Swift 2.3:
Y en Swift 3/4/5:
Coloque este código en layoutSubviews () si está utilizando AutoLayout.
En SwiftUI, todo esto es mucho más fácil:
fuente
layoutSubviews
CGSize(width: 0, height: 0.5)
view.bounds
no se ha creado tan obviamente queshadowPath
no pueda hacer referencia al rect de la vista, sino a algunosCGRectZero
. De todos modos, ¡poner esto debajolayoutSubviews
resolvió mi problema por fin!El truco es definir la
masksToBounds
propiedad de la capa de su vista correctamente:y debería funcionar.
( Fuente )
fuente
Puede crear una extensión para que UIView acceda a estos valores en el editor de diseño
fuente
También puede configurar la sombra a su vista desde el guión gráfico
fuente
A la vistaWillLayoutSubviews:
Usando la extensión de UIView:
Uso:
fuente
targetView: UIView
y quita el flequillo.self
? Me parece mucho más conveniente.if let
sintaxis en lugar de!
Entonces, sí, debería preferir la propiedad shadowPath para el rendimiento, pero también: Desde el archivo de encabezado de CALayer.shadowPath
Especificar la ruta explícitamente usando esta propiedad generalmente * mejorará el rendimiento de la representación, al igual que compartir la misma ruta * referencia en múltiples capas
Un truco menos conocido es compartir la misma referencia en varias capas. Por supuesto, tienen que usar la misma forma, pero esto es común con las celdas de vista de tabla / colección.
No sé por qué se vuelve más rápido si comparte instancias, supongo que almacena en caché la representación de la sombra y puede reutilizarla para otras instancias en la vista. Me pregunto si esto es incluso más rápido con
fuente