¿Cómo puedo agregar sombra a un círculo UIImageView o UIView?

Estoy intentando hacer un círculo UIImageView , y funciona. A continuación se muestra la forma en que lo uso para hacerlo:

 [self.pic.layer setMasksToBounds:YES]; [self.pic.layer setCornerRadius:50.0]; 

Me gustaría agregar algo de sombra a UIImageView . El código siguiente agrega algunas sombras a la vista de mi image; sin embargo, la vista de la image vuelve a tener forma cuadrada. ¿Alguien puede darme algunos consejos para resolver este problema? A continuación se muestra el código que uso para agregar la sombra:

 self.pic.layer.shadowColor = [UIColor purpleColor].CGColor; self.pic.layer.shadowOffset = CGSizeMake(0, 1); self.pic.layer.shadowOpacity = 1; self.pic.layer.shadowRadius = 1.0; self.pic.clipsToBounds = NO; 

Use la propiedad shadowPath y agregue un UIBezierPath con UIBezierPath networkingondeado

 self.pic.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.pic.frame cornerRadius:50.0].CGPath; 

EDITAR

Para una vista de image cuadrada, esta técnica no funciona directamente porque, como dijiste, la vista de la image vuelve a ser cuadrada. Motivo: establece clipsToBounds = NO para mostrar la sombra que elimina el recorte para el radio de la esquina, donde imageView es subvista del container .

Solución alternativa:
Agregue su vista de image en una vista de contenedor y luego aplique la sombra de capa a este contenedor. Lo que sigue es el código que probé.

 [self.imageView.layer setCornerRadius:60.0]; [self.imageView.layer setMasksToBounds:YES]; self.imageView.clipsToBounds = YES; self.container.backgroundColor = [UIColor clearColor]; self.container.layer.shadowColor = [UIColor blackColor].CGColor; self.container.layer.shadowOffset = CGSizeMake(5,15); self.container.layer.shadowOpacity = 0.5; self.container.layer.shadowRadius = 2.0; self.container.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.container.bounds cornerRadius:100.0].CGPath; 

El efecto resultante es como se muestra en la captura de pantalla,

introduzca la descripción de la imagen aquí

¡Espero que ayude!

Sin un contenedor, pero con una vista de background aquí está mis 2 centavos

Como una extensión rápida de 2.2

  image?.applyCircleShadow(5, shadowOpacity: 1) 
 extension UIView { func applyCircleShadow(shadowRadius: CGFloat = 2, shadowOpacity: Float = 0.3, shadowColor: CGColor = UIColor.blackColor().CGColor, shadowOffset: CGSize = CGSize.zero) { layer.cornerRadius = frame.size.height / 2 layer.masksToBounds = false layer.shadowColor = shadowColor layer.shadowOffset = shadowOffset layer.shadowRadius = shadowRadius layer.shadowOpacity = shadowOpacity } } extension UIImageView { override func applyCircleShadow(shadowRadius: CGFloat = 2, shadowOpacity: Float = 0.3, shadowColor: CGColor = UIColor.blackColor().CGColor, shadowOffset: CGSize = CGSize.zero) { // Use UIImageView.hashvalue as background view tag (should be unique) let background: UIView = superview?.viewWithTag(hashValue) ?? UIView() background.frame = frame background.backgroundColor = backgroundColor background.tag = hashValue background.applyCircleShadow(shadowRadius, shadowOpacity: shadowOpacity, shadowColor: shadowColor, shadowOffset: shadowOffset) layer.cornerRadius = background.layer.cornerRadius layer.masksToBounds = true superview?.insertSubview(background, belowSubview: self) } } 

En caso de que alguien busque la solución de trabajo Swift 3 o 4 :

  let imageSize: CGFloat = 64.0 // Create a container which has a shadow let imageCotainer = UIView(frame: CGRect(x: 0, y: 0, width: imageSize, height: imageSize)) imageCotainer.clipsToBounds = false imageCotainer.layer.shadowColor = UIColor.black.cgColor imageCotainer.layer.shadowOpacity = 0.2 imageCotainer.layer.shadowOffset = CGSize(width: 0, height: 1) imageCotainer.layer.shadowRadius = 2 // Create an image view that will be inserted into the container view let imageView = UIImageView(frame: imageCotainer.bounds) imageView.image = yourImage imageView.clipsToBounds = true let cornerRadius = imageView.frame.height / 2 imageView.layer.cornerRadius = cornerRadius // Draw a shadow imageCotainer.layer.shadowPath = UIBezierPath(roundedRect: imageCotainer.bounds, cornerRadius: cornerRadius).cgPath // Add image into container imageCotainer.addSubview(imageView) 

A veces también necesita establecer restricciones para la image dentro del contenedor, pero también puede funcionar sin él en algunos casos. Pero si no es así, agregue esto:

  // Set constraints for the image inside the container view imageView.translatesAutoresizingMaskIntoConstraints = false imageView.topAnchor.constraint(equalTo: imageCotainer.topAnchor).isActive = true imageView.leftAnchor.constraint(equalTo: imageCotainer.leftAnchor).isActive = true imageView.rightAnchor.constraint(equalTo: imageCotainer.rightAnchor).isActive = true imageView.bottomAnchor.constraint(equalTo: imageCotainer.bottomAnchor).isActive = true imageView.heightAnchor.constraint(equalToConstant: imageSize).isActive = true imageView.widthAnchor.constraint(equalToConstant: imageSize).isActive = true 
 yourImageView.layer.masksToBounds = NO; yourImageView.layer.shadowOffset = CGSizeMake(5, 0); yourImageView.layer.shadowRadius = 5; yourImageView.layer.shadowOpacity = 0.5; yourImageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:yourImageView.bounds].CGPath; 

testing este código …