我为了掩盖自己的观点而制造了一条道路:
let path = // create magic path (uiview bounds + 2 arcs)
let mask = CAShapeLayer()
mask.path = path.cgPath
view.layer.masksToBounds = false
view.layer.mask = mask
到此为止一切都好。
现在我想添加一个跟随路径的阴影,是否有可能?
我尝试了几种方式,最后一种是:
mask.shadowPath = path.cgPath
mask.shadowColor = UIColor.red.cgColor
mask.shadowOffset = CGSize(width: 10, height: 2.0)
mask.shadowOpacity = 0.5
但是这会产生部分阴影并且具有原始视图的颜色..
使用调试视图层次结构:
有什么建议吗?
最终结果应该与此类似,但是随着阴影的出现"跟随"路径上的弧线。
答案 0 :(得分:8)
当您向图层添加蒙版时,它会剪切该蒙版之外的任何内容 - 包括阴影。要实现此目的,您需要在蒙版视图下方添加一个“阴影”视图,该视图与蒙版具有相同的路径。
或者将阴影图层添加到蒙版视图的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)
如果你打算在其他地方使用它,你可以创建一个包含阴影层的ShadowMaskedView
,以及带有路径属性的蒙版视图。
答案 1 :(得分:-1)
您可以尝试以下扩展程序:
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
}
}