Applying a Gradient to CAShapeLayer

前端 未结 3 1287

Does anyone have any experience in applying a Gradient to a CAShapeLayer? CAShapeLayer is a fantastic layer class, but it appears to only support solid fill coloring, wherea

3条回答
  •  独厮守ぢ
    2020-12-04 18:37

    Many thanks to @Palimondo for a great answer!

    In case someone is looking for Swift 4 + filling animation code of this solution:

        let myView = UIView(frame: .init(x: 0, y: 0, width: 200, height: 150))
        view.addSubview(myView)
        myView.center = view.center
    
        // Start and finish point
        let startPoint = CGPoint(x: myView.bounds.minX, y: myView.bounds.midY)
        let finishPoint = CGPoint(x: myView.bounds.maxX, y: myView.bounds.midY)
    
        // Path
        let path = UIBezierPath()
        path.move(to: startPoint)
        path.addLine(to: finishPoint)
    
        // Gradient Mask
        let gradientMask = CAShapeLayer()
        let lineHeight = myView.frame.height
        gradientMask.fillColor = UIColor.clear.cgColor
        gradientMask.strokeColor = UIColor.black.cgColor
        gradientMask.lineWidth = lineHeight
        gradientMask.frame = myView.bounds
        gradientMask.path = path.cgPath
    
        // Gradient Layer
        let gradientLayer = CAGradientLayer()
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
    
        // make sure to use .cgColor
        gradientLayer.colors = [UIColor.red.cgColor, UIColor.green.cgColor]
        gradientLayer.frame = myView.bounds
        gradientLayer.mask = gradientMask
    
        myView.layer.addSublayer(gradientLayer)
    
        // Corner radius
        myView.layer.cornerRadius = 10
        myView.clipsToBounds = true
    

    Extra. In case you also need a "filling animation", add this lines:

        // Filling animation
        let animation = CABasicAnimation(keyPath: "strokeEnd")
        animation.fromValue = 0
        animation.duration = 10
        gradientMask.add(animation, forKey: "LineAnimation")
    

提交回复
热议问题