with radius corner and ios swift uiview shadow

ios - radius - Añadiendo sombra interior a la parte superior de UIView



uiview shadow swift 4 (6)

Actualicé la respuesta de @NRitH e hice una extensión también modificada para que pueda manipular múltiples bordes de una sola vez

uso

myview.addShadow(to: [.top,.bottom], radius: 15.0)

extension UIView{ func addShadow(to edges:[UIRectEdge], radius:CGFloat){ let toColor = UIColor(colorLiteralRed: 235.0/255.0, green: 235.0/255.0, blue: 235.0/255.0, alpha: 1.0) let fromColor = UIColor(colorLiteralRed: 188.0/255.0, green: 188.0/255.0, blue: 188.0/255.0, alpha: 1.0) // Set up its frame. let viewFrame = self.frame for edge in edges{ let gradientlayer = CAGradientLayer() gradientlayer.colors = [fromColor.cgColor,toColor.cgColor] gradientlayer.shadowRadius = radius switch edge { case UIRectEdge.top: gradientlayer.startPoint = CGPoint(x: 0.5, y: 0.0) gradientlayer.endPoint = CGPoint(x: 0.5, y: 1.0) gradientlayer.frame = CGRect(x: 0.0, y: 0.0, width: viewFrame.width, height: gradientlayer.shadowRadius) case UIRectEdge.bottom: gradientlayer.startPoint = CGPoint(x: 0.5, y: 1.0) gradientlayer.endPoint = CGPoint(x: 0.5, y: 0.0) gradientlayer.frame = CGRect(x: 0.0, y: viewFrame.height - gradientlayer.shadowRadius, width: viewFrame.width, height: gradientlayer.shadowRadius) case UIRectEdge.left: gradientlayer.startPoint = CGPoint(x: 0.0, y: 0.5) gradientlayer.endPoint = CGPoint(x: 1.0, y: 0.5) gradientlayer.frame = CGRect(x: 0.0, y: 0.0, width: gradientlayer.shadowRadius, height: viewFrame.height) case UIRectEdge.right: gradientlayer.startPoint = CGPoint(x: 1.0, y: 0.5) gradientlayer.endPoint = CGPoint(x: 0.0, y: 0.5) gradientlayer.frame = CGRect(x: viewFrame.width - gradientlayer.shadowRadius, y: 0.0, width: gradientlayer.shadowRadius, height: viewFrame.height) default: break } self.layer.addSublayer(gradientlayer) } } func removeAllSublayers(){ if let sublayers = self.layer.sublayers, !sublayers.isEmpty{ for sublayer in sublayers{ sublayer.removeFromSuperlayer() } } } }

Miré hacia arriba, pero no pude encontrar cómo puedo agregar una sombra interior a UIView, solo arriba (de arriba a abajo) para Swift. ¿Cuál es la mejor manera de agregar círculo interior en Swift?

Edición: he encontrado algunas preguntas y respuestas en SO, sin embargo, o están en obj-c o se ven tan complicadas. Estaba buscando una forma más Swifty, si hay alguna

Lo que quiero lograr:


Ajusté la modificación realizada por @ anoop4real usando clear como toColor e hice la interfaz más en línea con la configuración de la sombra en CALayer, incluidos los valores predeterminados, con la excepción de la opacidad, que se establece en 0.0 de forma predeterminada. Fui con un valor predeterminado de 0.6 ya que se veía más natural.

extension UIView { func addShadow(to edges: [UIRectEdge], radius: CGFloat = 3.0, opacity: Float = 0.6, color: CGColor = UIColor.black.cgColor) { let fromColor = color let toColor = UIColor.clear.cgColor let viewFrame = self.frame for edge in edges { let gradientLayer = CAGradientLayer() gradientLayer.colors = [fromColor, toColor] gradientLayer.opacity = opacity switch edge { case .top: gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0) gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0) gradientLayer.frame = CGRect(x: 0.0, y: 0.0, width: viewFrame.width, height: radius) case .bottom: gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0) gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0) gradientLayer.frame = CGRect(x: 0.0, y: viewFrame.height - radius, width: viewFrame.width, height: radius) case .left: gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) gradientLayer.frame = CGRect(x: 0.0, y: 0.0, width: radius, height: viewFrame.height) case .right: gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.5) gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.5) gradientLayer.frame = CGRect(x: viewFrame.width - radius, y: 0.0, width: radius, height: viewFrame.height) default: break } self.layer.addSublayer(gradientLayer) } } func removeAllShadows() { if let sublayers = self.layer.sublayers, !sublayers.isEmpty { for sublayer in sublayers { sublayer.removeFromSuperlayer() } } } }

La vista superior es la configuración predeterminada, y la parte inferior utiliza un radio de 5.0 para mostrar más claramente.

view1.addShadow([.top, .bottom, .left, .right]) view2.addShadow([.top, .bottom, .left, .right], radius: 5.0) view2.backgroundColor = .orange


Aquí hay una versión Swift pura que yo preparé:

public class EdgeShadowLayer: CAGradientLayer { public enum Edge { case Top case Left case Bottom case Right } public init(forView view: UIView, edge: Edge = Edge.Top, shadowRadius radius: CGFloat = 20.0, toColor: UIColor = UIColor.white, fromColor: UIColor = UIColor.black) { super.init() self.colors = [fromColor.cgColor, toColor.cgColor] self.shadowRadius = radius let viewFrame = view.frame switch edge { case .Top: startPoint = CGPoint(x: 0.5, y: 0.0) endPoint = CGPoint(x: 0.5, y: 1.0) self.frame = CGRect(x: 0.0, y: 0.0, width: viewFrame.width, height: shadowRadius) case .Bottom: startPoint = CGPoint(x: 0.5, y: 1.0) endPoint = CGPoint(x: 0.5, y: 0.0) self.frame = CGRect(x: 0.0, y: viewFrame.height - shadowRadius, width: viewFrame.width, height: shadowRadius) case .Left: startPoint = CGPoint(x: 0.0, y: 0.5) endPoint = CGPoint(x: 1.0, y: 0.5) self.frame = CGRect(x: 0.0, y: 0.0, width: shadowRadius, height: viewFrame.height) case .Right: startPoint = CGPoint(x: 1.0, y: 0.5) endPoint = CGPoint(x: 0.0, y: 0.5) self.frame = CGRect(x: viewFrame.width - shadowRadius, y: 0.0, width: shadowRadius, height: viewFrame.height) } } required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }

Para usarlo,

let topShadow = EdgeShadowLayer(forView: targetView, edge: .Top) targetView.layer.addSublayer(topShadow)

Tenga en cuenta que el valor predeterminado es un degradado de negro a blanco que tiene 20 puntos de profundidad.

El código completo, con un UIViewController muestra que le permite alternar las sombras en las cuatro esquinas de una vista, se puede encontrar en https://github.com/jrtibbetts/Tenebrae . También he documentado el EdgeShadowLayer bastante a fondo.


Así es como agregué una sombra interior en una vista.

func addInerShadowLayer() { clipsToBounds = true let shapeLayer = CAShapeLayer() let path = UIBezierPath(roundedRect: CGRect(x: -10, y: -self.frame.height/2, width: self.frame.width + 20, height: self.frame.height*2), cornerRadius: 0) let buttonPath = UIBezierPath(roundedRect: CGRect(x: -1, y: -1, width: self.frame.width+2, height: self.frame.height+2), cornerRadius: self.frame.height/2) path.append(buttonPath.reversing()) shapeLayer.path = path.cgPath self.layer.addSublayer(shapeLayer) shapeLayer.shadowOpacity = 0.1 shapeLayer.shadowColor = UIColor.red.cgColor shapeLayer.shadowOffset = CGSize(width: 0, height: 4) shapeLayer.shadowRadius = 3 }


Reescribí la solución @NRitH en Swift 3, también lo refactoré ligeramente:

final class SideShadowLayer: CAGradientLayer { enum Side { case top, bottom, left, right } init(frame: CGRect, side: Side, shadowWidth: CGFloat, fromColor: UIColor = .black, toColor: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0), opacity: Float = 0.5) { super.init() colors = [fromColor.cgColor, toColor.cgColor] self.opacity = opacity switch side { case .bottom: startPoint = CGPoint(x: 0.5, y: 1.0) endPoint = CGPoint(x: 0.5, y: 0.0) self.frame = CGRect(x: 0, y: frame.height - shadowWidth, width: frame.width, height: shadowWidth) case .top: startPoint = CGPoint(x: 0.5, y: 0.0) endPoint = CGPoint(x: 0.5, y: 1.0) self.frame = CGRect(x: 0, y: 0, width: frame.width, height: shadowWidth) case .left: startPoint = CGPoint(x: 0.0, y: 0.5) endPoint = CGPoint(x: 1.0, y: 0.5) self.frame = CGRect(x: 0, y: 0, width: shadowWidth, height: frame.height) case .right: startPoint = CGPoint(x: 1.0, y: 0.5) endPoint = CGPoint(x: 0.0, y: 0.5) self.frame = CGRect(x: frame.width - shadowWidth, y: 0, width: shadowWidth, height: frame.height) } } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } }


Usé la sombra interna del implemento para UIView usando Objective-C. Intento traducir el código a swift. Por favor, perdóname por mi pobre sintaxis rápida.

puede llamar a la siguiente función en UIView.didMoveToSuperview

func drawShadow() { if nil == self.shadowLayer { let size = self.frame.size self.clipsToBounds = true let layer: CALayer = CALayer() layer.backgroundColor = UIColor.lightGrayColor().CGColor layer.position = CGPointMake(size.width / 2, -size.height / 2 + 0.5) layer.bounds = CGRectMake(0, 0, size.width, size.height) layer.shadowColor = UIColor.darkGrayColor().CGColor layer.shadowOffset = CGSizeMake(0.5, 0.5) layer.shadowOpacity = 0.8 layer.shadowRadius = 5.0 self.shadowLayer = layer self.layer.addSublayer(layer) } }