Search code examples
iosuiviewswift3core-graphicsdraw

How to fill a bezier path with gradient color


I have a UIBezierPath inside my custom UIView draw(_ rect: CGRect) function. I would like to fill the path with a gradient color. Please can anybody guide me how can I do that.

I need to fill the clip with a gradient color and then stroke the path with black color.

There are some posts in SO which does not solve the problem. For example Swift: Gradient along a bezier path (using CALayers) this post guides how to draw on a layer in UIView but not in a UIBezierPath.

NB: I am working on Swift-3


Solution

  • To answer this question of yours,

    I have a UIBezierPath inside my custom UIView draw(_ rect: CGRect) function. I would like to fill the path with a gradient color.

    Lets say you have an oval path,

    let path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 100, height: 100))
    

    To create a gradient,

    let gradient = CAGradientLayer()
    gradient.frame = path.bounds
    gradient.colors = [UIColor.magenta.cgColor, UIColor.cyan.cgColor]
    

    We need a mask layer for gradient,

    let shapeMask = CAShapeLayer()
    shapeMask.path = path.cgPath
    

    Now set this shapeLayer as mask of gradient layer and add it to view's layer as subLayer

    gradient.mask = shapeMask
    yourCustomView.layer.addSublayer(gradient)
    

    Update Create a base layer with stroke and add before creating gradient layer.

    let shape = CAShapeLayer()
    shape.path = path.cgPath
    shape.lineWidth = 2.0
    shape.strokeColor = UIColor.black.cgColor
    self.view.layer.addSublayer(shape)
    
    let gradient = CAGradientLayer()
    gradient.frame = path.bounds
    gradient.colors = [UIColor.magenta.cgColor, UIColor.cyan.cgColor]
    
    let shapeMask = CAShapeLayer()
    shapeMask.path = path.cgPath
    gradient.mask = shapeMask
    
    self.view.layer.addSublayer(gradient)