给定一个CAShapeLayer定义路径,如下图所示,我想添加一个CAshapeientLayer,它遵循形状层的路径。
例如,给定从black-> red的渐变:
我发现的每个以前的帖子实际上都没有回答这个问题。
例如,由于我只能添加轴向CAGradientLayers,因此可以执行此操作(如下图所示),但是您会看到它是不正确的(左上方再次变为黑色)。如何使渐变实际遵循路径/遮罩
最佳答案
对于简单的圆形路径,新的圆锥渐变非常好。我能够立即得到它(这是一个圆锥形渐变层,被一个圆形层遮盖了):
我使用红色和绿色以便清楚地显示渐变。这似乎与您追求的目标不尽相同,但是我不相信既然存在.conic
,实现您的目标将非常困难。
class MyGradientView : UIView {
override class var layerClass : AnyClass { return CAGradientLayer.self }
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
let lay = self.layer as! CAGradientLayer
lay.type = .conic
lay.startPoint = CGPoint(x:0.5,y:0.5)
lay.endPoint = CGPoint(x:0.5,y:0)
lay.colors = [UIColor.green.cgColor, UIColor.red.cgColor]
}
override func layoutSubviews() {
super.layoutSubviews()
let shape = CAShapeLayer()
shape.frame = self.bounds
shape.strokeColor = UIColor.black.cgColor
shape.fillColor = UIColor.clear.cgColor
let b = UIBezierPath(ovalIn: shape.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)))
shape.path = b.cgPath
shape.lineWidth = 10
shape.lineCap = .round
shape.strokeStart = 0.1
shape.strokeEnd = 0.9
shape.anchorPoint = CGPoint(x: 0.5, y: 0.5)
shape.transform = CATransform3DMakeRotation(-.pi/2, 0, 0, 1)
self.layer.mask = shape
}
}