iOS: ¿Cómo agregar shadow drop y shadow stroke en UIView?

Quiero agregar shadow drop y stroke shadow en UIView Esto es lo que mi diseñador me dio para aplicar sombra,

Esta es la pantalla de efectos aplicados de photoshop,

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

La vista con la sombra requerida (resultado esperado)

introduzca la descripción de la imagen aquí

Probé lo siguiente para get la sombra

 viewCheck.layer.masksToBounds = NO; viewCheck.layer.cornerRadius = 5.f; viewCheck.layer.shadowOffset = CGSizeMake(.0f,2.5f); viewCheck.layer.shadowRadius = 1.5f; viewCheck.layer.shadowOpacity = .9f; viewCheck.layer.shadowColor = [UIColor colorWithRed:176.f/255.f green:199.f/255.f blue:226.f/255.f alpha:1.f].CGColor; viewCheck.layer.shadowPath = [UIBezierPath bezierPathWithRect:viewCheck.bounds].CGPath; 

Y este es el resultado de eso,

introduzca la descripción de la imagen aquí

Estoy teniendo problemas para entender cómo puedo aplicar stroke y shadow shadows como se muestra en las capturas de pantalla de photoshop (he agregado más arriba). ¿Cómo aplicar distancia, extensión, tamaño, position?

¿Alguien puede apuntarme a una guía para aplicar este tipo de sombras? ¡Hay muchos efectos de sombra que salen y quiero aprender cómo puede ser posible en lugar de hacer cada una de las preguntas aquí!

Gracias 🙂

Creo que la mayoría de la configuration que buscas se puede lograr empleando la propiedad shadowPath .

 viewCheck.layer.shadowRadius = 1.5f; viewCheck.layer.shadowColor = [UIColor colorWithRed:176.f/255.f green:199.f/255.f blue:226.f/255.f alpha:1.f].CGColor; viewCheck.layer.shadowOffset = CGSizeMake(0.0f, 0.0f); viewCheck.layer.shadowOpacity = 0.9f; viewCheck.layer.masksToBounds = NO; UIEdgeInsets shadowInsets = UIEdgeInsetsMake(0, 0, -1.5f, 0); UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:UIEdgeInsetsInsetRect(viewCheck.bounds, shadowInsets)]; viewCheck.layer.shadowPath = shadowPath.CGPath; 

Por ejemplo, configurando shadowInsets esta manera.

 UIEdgeInsets shadowInsets = UIEdgeInsetsMake(0, 0, -1.5f, 0); 

obtendrás una buena sombra deseable:

introduzca la descripción de la imagen aquí

Ahora puede decidir cómo desea que se construya el rectángulo de sombra controlando las inserciones del rectángulo de la ruta de sombra.

Los siguientes son los pasos para el User Defined Runtime Attribute por el User Defined Runtime Attribute .

  1. Abra un storyboard o un file xib en Interface Builder.
  2. En Interface Builder, select el object al que agregar el atributo.
  3. Elija Ver> Utilidades> Mostrar inspector de identidad.

El inspector de identidad aparece en el área de services públicos. Como se muestra a continuación, el editor de attributes de time de ejecución definido por el usuario es uno de los elementos del inspector.

introduzca la descripción de la imagen aquí

  1. Haga clic en el button Agregar (+) en la parte inferior izquierda del editor de attributes de time de ejecución definido por el usuario.

introduzca la descripción de la imagen aquí

Para darle a Border Of UIView .

Agregue #import "QuartzCore/QuartzCore.h" fram work.

 myView.layer.cornerRadius = 15.0; // set as you want. myView.layer.borderColor = [UIColor lightGrayColor].CGColor; // set color as you want. myView.layer.borderWidth = 1.0; // set as you want. 

Lo siento, solo tengo la solución Swift pero aquí están las extensiones UIView que utilizo para hacer esta tarea:

 // MARK: Layer Extensions extension UIView { func setCornerRadius(#radius: CGFloat) { self.layer.cornerRadius = radius self.layer.masksToBounds = true } func addShadow(#offset: CGSize, radius: CGFloat, color: UIColor, opacity: Float, cornerRadius: CGFloat? = nil) { self.layer.shadowOffset = offset self.layer.shadowRadius = radius self.layer.shadowOpacity = opacity self.layer.shadowColor = color.CGColor if let r = cornerRadius { self.layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: r).CGPath } } func addBorder(#width: CGFloat, color: UIColor) { self.layer.borderWidth = width self.layer.borderColor = color.CGColor self.layer.masksToBounds = true } func drawStroke(#width: CGFloat, color: UIColor) { let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: self.w, height: self.w), cornerRadius: self.w/2) let shapeLayer = CAShapeLayer () shapeLayer.path = path.CGPath shapeLayer.fillColor = UIColor.clearColor().CGColor shapeLayer.strokeColor = color.CGColor shapeLayer.lineWidth = width self.layer.addSublayer(shapeLayer) } } 

Nunca lo intenté pero podría pegar este código en cualquier file Swift y probablemente llamarlos desde el código Obj-C.