Dibuja sombra solo desde 3 lados de UIView

Implementé con éxito dibujando una sombra alnetworkingedor de mi UIView así:

 block1.layer.masksToBounds = NO; block1.layer.shadowOffset = CGSizeMake(0, 0); block1.layer.shadowRadius = 1; block1.layer.shadowOpacity = 0.7; 

Lo que ahora sucede es que tengo una UIView rectangular y me gustaría dibujar la sombra alnetworkingedor de ella a tres lados, dejando el lado inferior sin la sombra.

Sé que tengo que especificar el block1.layer.shadowPath creando un nuevo UIBezierPath pero no estoy seguro de cómo hacerlo.

Obviamente, configurar layer.shadowOffset no me servirá.

¡Gracias por adelantado!

Sé que dices que configurar layer.shadowOffset no funcionará para ti, pero puedes poner valores negativos para que configurarlo layer.shadowOffset = CGSizeMake(0.0, -2.0) se acerque al efecto que estás buscando pero Por supuesto, espero que quieras que sea en los tres lados.

¡Entonces aquí vamos con layer.shadowPath !

 UIView *block1 = [[UIView alloc] initWithFrame:CGRectMake(32.0, 32.0, 128.0, 128.0)]; [block1 setBackgroundColor:[UIColor orangeColor]]; [self.view addSubview:block1]; block1.layer.masksToBounds = NO; block1.layer.shadowOffset = CGSizeMake(0, 0); block1.layer.shadowRadius = 1; block1.layer.shadowOpacity = 0.7; UIBezierPath *path = [UIBezierPath bezierPath]; // Start at the Top Left Corner [path moveToPoint:CGPointMake(0.0, 0.0)]; // Move to the Top Right Corner [path addLineToPoint:CGPointMake(CGRectGetWidth(block1.frame), 0.0)]; // Move to the Bottom Right Corner [path addLineToPoint:CGPointMake(CGRectGetWidth(block1.frame), CGRectGetHeight(block1.frame))]; // This is the extra point in the middle :) Its the secret sauce. [path addLineToPoint:CGPointMake(CGRectGetWidth(block1.frame) / 2.0, CGRectGetHeight(block1.frame) / 2.0)]; // Move to the Bottom Left Corner [path addLineToPoint:CGPointMake(0.0, CGRectGetHeight(block1.frame))]; // Move to the Close the Path [path closePath]; block1.layer.shadowPath = path.CGPath; 

Y para darle una idea de lo que está pasando, aquí está el path de sombra real que acaba de dibujar 🙂

introduzca la descripción de la imagen aquí

Es posible simplemente cambiar ese punto medio adicional antes o después de las otras líneas para elegir qué lado se omitirá.

Actualización de Ryan Poolos Respuesta a Swift 3.0

Gracias a Ryan Poolos

 class sampleViewController: UIViewController { var block1: UIView! = nil override func viewDidLoad() { super.viewDidLoad() block1 = UIView(frame: CGRect(x: 32.0, y: 32.0, width: 128.0, height: 128.0)) block1.backgroundColor = UIColor.orange self.view.addSubview(block1) block1.layer.masksToBounds = false block1.layer.shadowOffset = CGSize(width: 0.0, height: 0.0) block1.layer.shadowRadius = 1.0 block1.layer.shadowOpacity = 0.7 let path = UIBezierPath() // Start at the Top Left Corner path.move(to: CGPoint(x: 0.0, y: 0.0)) // Move to the Top Right Corner path.addLine(to: CGPoint(x: block1.frame.size.width, y: 0.0)) // Move to the Bottom Right Corner path.addLine(to: CGPoint(x: block1.frame.size.width, y: block1.frame.size.height)) // This is the extra point in the middle :) Its the secret sauce. path.addLine(to: CGPoint(x: block1.frame.size.width/2.0, y: block1.frame.size.height/2.0)) // Move to the Bottom Left Corner path.addLine(to: CGPoint(x: 0.0, y: block1.frame.size.height)) path.close() block1.layer.shadowPath = path.cgPath } } 

Resultado:

introduzca la descripción de la imagen aquí