UIView图层上的阴影

我已经制定了一条path来掩盖我的观点:

let path = // create magic path (uiview bounds + 2 arcs) let mask = CAShapeLayer() mask.path = path.cgPath view.layer.masksToBounds = false view.layer.mask = mask 

到这里一切OK。

现在我想添加一个跟随path的影子,是否可能?

我尝试了几种方法,最后一个是:

 mask.shadowPath = path.cgPath mask.shadowColor = UIColor.red.cgColor mask.shadowOffset = CGSize(width: 10, height: 2.0) mask.shadowOpacity = 0.5 

但是这会产生一个部分阴影和原始视图的颜色。

在这里输入图像说明

使用debugging视图层次结构

在这里输入图像说明

有什么build议?

最后的结果应该与此类似,但是在path上“跟随”弧的影子。

在这里输入图像说明

当您将遮罩添加到图层时,它会剪裁遮罩外的所有内容(包括阴影)。 为了达到这个目的,你需要在遮罩视图的下方添加一个“阴影”视图,该遮罩具有与遮罩相同的path。

或者向遮罩视图的superview添加阴影图层。

 let view = UIView(frame: CGRect(x: 50, y: 70, width: 100, height: 60)) view.backgroundColor = .cyan let mask = CAShapeLayer() mask.path = UIBezierPath(roundedRect: view.bounds, cornerRadius: 10).cgPath view.layer.mask = mask let shadowLayer = CAShapeLayer() shadowLayer.frame = view.frame shadowLayer.path = UIBezierPath(roundedRect: view.bounds, cornerRadius: 10).cgPath shadowLayer.shadowOpacity = 0.5 shadowLayer.shadowRadius = 5 shadowLayer.masksToBounds = false shadowLayer.shadowOffset = .zero let container = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) container.backgroundColor = .white container.layer.addSublayer(shadowLayer) container.addSubview(view) 

在这里输入图像说明

如果你打算在其他地方使用这个,你可以创build一个ShadowMaskedView ,它包含阴影图层和被遮罩的视图 – 也许有一个path属性。

你可以试试这个扩展:

 extension UIView { func dropShadow() { self.layer.masksToBounds = false self.layer.shadowColor = UIColor.black.cgColor self.layer.shadowOpacity = 0.5 self.layer.shadowOffset = CGSize(width: -1, height: 1) self.layer.shadowRadius = 1 self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath self.layer.shouldRasterize = true } }