Ios 使用CAShapeLayer添加阴影?

Ios 使用CAShapeLayer添加阴影?,ios,calayer,Ios,Calayer,我有一个只有底部圆角的CAShapeLayer。我想要的是在底部添加一个阴影,但它不起作用,即使代码看起来显然是正确的。所有这些都围绕着底角,但我看不到影子 let shapeLayer = CAShapeLayer() let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.bottomLeft, .bottomRight], cornerRadii: CGSize(width: 20, heigh

我有一个只有底部圆角的
CAShapeLayer
。我想要的是在底部添加一个阴影,但它不起作用,即使代码看起来显然是正确的。所有这些都围绕着底角,但我看不到影子

let shapeLayer = CAShapeLayer()

    let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.bottomLeft, .bottomRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    shapeLayer.path = path

    shapeLayer.shadowColor = UIColor(r: 233, g: 233, b: 233).cgColor
    shapeLayer.shadowOffset = CGSize(width: 0.0, height: 2.8)
    shapeLayer.shadowOpacity = 1.0
    shapeLayer.shadowRadius = 0.0
    shapeLayer.shouldRasterize = true
    shapeLayer.rasterizationScale = UIScreen.main.scale

    layer.rasterizationScale = UIScreen.main.scale
    layer.mask = shapeLayer

shapeLayer
正在取整视图的各个角落,因为它被设置为图层的遮罩。您可能希望将其添加为子层

旧版:

layer.mask = shapeLayer
layer.addSublayer(shapeLayer)
新建:

layer.mask = shapeLayer
layer.addSublayer(shapeLayer)
我在这里写了另一个关于向圆角视图添加阴影的答案,如果有帮助的话:

另一个解决方案

以下UIView扩展将适用于遮罩视图的任何形状

extension UIView {

  func addShadow() {
     self.backgroundColor = UIColor.clear
     let roundedShapeLayer = CAShapeLayer()
     let roundedMaskPath = UIBezierPath(roundedRect: self.bounds,
                                       byRoundingCorners: [.topLeft, .bottomLeft, .bottomRight],
                                       cornerRadii: CGSize(width: 8, height: 8))

     roundedShapeLayer.frame = self.bounds
     roundedShapeLayer.fillColor = UIColor.white.cgColor
     roundedShapeLayer.path = roundedMaskPath.cgPath

     self.layer.insertSublayer(roundedShapeLayer, at: 0)

     self.layer.shadowOpacity = 0.4
     self.layer.shadowOffset = CGSize(width: -0.1, height: 4)
     self.layer.shadowRadius = 3
     self.layer.shadowColor = UIColor.lightGray.cgColor
   }
}

谢谢我从这个问题中得到了一个想法。我所做的只是创建一个带有阴影的虚拟背景视图;并将其插入具有圆角的视图(使用
insertSubView
)中。将子层添加到“我的层”中会使视图完全变黑