给定一个CAShapeLayer定义路径,如下图所示,我想添加一个CAshapeientLayer,它遵循形状层的路径。

例如,给定从black-> red的渐变:

  • 右上角的圆形部分为黑色
  • ,如果滑块为100,则左上角为红色
  • ,如果滑块为50,则滑块的一半为黑色(如下所示),可见的梯度将从黑色(右上方)变为底部
  • 的红黑色

    ios - 如何使CAGradientLayer遵循CGPath-LMLPHP

    我发现的每个以前的帖子实际上都没有回答这个问题。
    例如,由于我只能添加轴向CAGradientLayers,因此可以执行此操作(如下图所示),但是您会看到它是不正确的(左上方再次变为黑色)。如何使渐变实际遵循路径/遮罩

    ios - 如何使CAGradientLayer遵循CGPath-LMLPHP

    最佳答案

    对于简单的圆形路径,新的圆锥渐变非常好。我能够立即得到它(这是一个圆锥形渐变层,被一个圆形层遮盖了):

    ios - 如何使CAGradientLayer遵循CGPath-LMLPHP

    我使用红色和绿色以便清楚地显示渐变。这似乎与您追求的目标不尽相同,但是我不相信既然存在.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
        }
    }
    

    10-06 14:48